我阅读了很多帖子(一个是this)和文章,根据这些文章,您不应将context
从Activity
传递到非活动类,以避免内存泄漏。
我必须在非活动类中使用方法findViewById()
。
到目前为止,我做到了这一点:
public class Text{
Activity activity;
public Text(Activity activity){
this.activity = activity;
}
public TextView getMyTextView(){
return activity.findViewById(R.id.textView1)
}
}
现在我想知道即使“传递”Activity
也会导致内存泄漏。
例如,在非活动类中调用方法findViewById
的最佳方式是什么。
答案 0 :(得分:2)
唯一可能导致内存泄漏的事情是误解了GC的工作原理。避免内存泄漏的基本规则是确保this.GetPlugin<SessionFeature>().SessionBagExpiry = TimeSpan.FromDays(14);
应收集的对象与GC
断开连接:
有一组GC根,其中一个是静态字段。因此,如果您将活动分配到此类字段,则GC无法收集它:
GC Root
此活动(包含所有视图,位图和所有连接的对象)将保留在内存中,直到应用程序未被系统杀死。
另一个GC根是class ActivityRef {
public static Activity ref;
public static void setActivity(Activity activity){
ActivityRef.ref = activity;
}
}
。
Thread
当线程处于活动状态时,GC无法收集活动实例。
因此,没有最好的方法或方法可以调用class SomeThread extends Thread{
Activity ref;
public void setActivity(Activity activity){
this.ref = activity;
}
}
来避免内存泄漏,有内存模型描述了GC的工作原理,如果遵循这些规则,就不会有内存泄漏。更多here。
关于WeakReferences的好文章:
答案 1 :(得分:1)
而不是传递活动引用传递给必要的视图。确保&#34;非活动&#34;在调用活动类之后创建类引用,并在销毁活动之前释放引用(nonActivityReference = null)。