我阅读了很多帖子(其中一篇是 this )和文章,根据这些文章,您不应将 context
从 Activity
传递到非 Activity 类,以避免内存泄漏。
我必须在非 Activity 类中使用方法findViewById()
。
到目前为止,我这样做了:
public class Text{
Activity activity;
public Text(Activity activity){
this.activity = activity;
}
public TextView getMyTextView(){
return activity.findViewById(R.id.textView1)
}
}
现在我想知道即使“传递”一个 Activity
是否也会导致内存泄漏。
例如,在非 Activity 类中调用 findViewById
方法的最佳方式是什么。
最佳答案
唯一可能导致内存泄漏的是对 GC 工作原理的误解。避免内存泄漏的基本规则是确保应由 GC
收集的对象与 GC Root
断开连接:
有一组GC根,其中一个是静态字段。因此,如果您将 Activity 分配给此类字段,则 GC 无法收集它:
class ActivityRef {
public static Activity ref;
public static void setActivity(Activity activity){
ActivityRef.ref = activity;
}
}
此 Activity (包含所有 View 、位图和所有连接的对象)将保留在内存中,直到应用程序未被系统终止。
另一个GC根是Thread
。
class SomeThread extends Thread{
Activity ref;
public void setActivity(Activity activity){
this.ref = activity;
}
}
当线程处于 Activity 状态时,GC 无法收集 Activity 实例。
因此,没有最好的方式或方法来调用 findViewById
来避免内存泄漏,有一个内存模型描述了 GC 的工作原理,如果您遵循这些规则,您将永远不会出现内存泄漏。更多 here .
关于弱引用的好文章:
关于android - 是否可以将 Activity 传递给非 Activity 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41912993/