是否可以将Activity传递给非活动类?

时间:2017-01-28 17:59:21

标签: android performance android-activity

我阅读了很多帖子(一个是this)和文章,根据这些文章,您不应将contextActivity传递到非活动类,以避免内存泄漏。

我必须在非活动类中使用方法findViewById()。 到目前为止,我做到了这一点:

    public class Text{

        Activity activity;

        public Text(Activity activity){
           this.activity = activity;
        }

        public TextView getMyTextView(){
           return activity.findViewById(R.id.textView1)
        }

    }

现在我想知道即使“传递”Activity也会导致内存泄漏。 例如,在非活动类中调用方法findViewById的最佳方式是什么。

2 个答案:

答案 0 :(得分:2)

唯一可能导致内存泄漏的事情是误解了GC的工作原理。避免内存泄漏的基本规则是确保this.GetPlugin<SessionFeature>().SessionBagExpiry = TimeSpan.FromDays(14); 应收集的对象与GC断开连接:

enter image description here

有一组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)。