[英]Does passing a context from an Activity to a static class hold that Activity forever? Memory leak?
[英]Passing Activity's context (prevent memory leak)
我有一个非活动类,该类在我的活动类中创建许多视图,例如ImageView和TextView。
为此,我需要将活动上下文从activity class
传递到non-activity class
。 这是我的non-activity class
的代码-
public class Create {
Activity activity;
Create(Activity act){
activity = act;
}
}
这是一个好习惯吗? 我应该像这样使用getApplicationContext()
吗? 两种方法有什么区别? --
public class Create {
Context context;
public Create(Context context){
this.context = context.getApplicationContext();
}
}
如果使用上述方法,会不会发生内存泄漏? 哪种方法更好? 使用后如何销毁上下文以防止内存泄漏?
这样将Activity/Context
声明为final
或protected
有什么好处?
protected Context context;
要么
final Context context;
这取决于您如何使用Create对象。 如果您像这样使用它:
public class MyActivity extends Activity {
public void someMethod() {
Create mCreate = new Create(this);
mCreate.doSomething();
}
}
没事的 如果您使用内部类在后台执行某些操作,并且该活动已关闭,例如,如果内部类尚未完成处理,则可能会泄漏上下文。
在使用context.getapplicationcontext与传递活动(这是一个上下文)的情况下,后者在这种情况下更好,因为我假设您的create类只是为其关联的活动创建视图。 活动完成后,这些视图的生命周期可能已经结束。
Android Activity扩展了ContextThemeWrapper。
ContextThemeWrapper ultimatley扩展了Context。
因此,可以将上下文视为超类,将活动视为子类。 例如,上下文具有10个方法,活动具有相同的10个方法以及20个其他方法。
就内存泄漏而言,这完全取决于您的使用方式。 确保销毁onDestroy()中所有未使用的对象,以防止内存泄漏。 参见http://www.raizlabs.com/dev/2014/04/hunting-your-leaks-memory-management-in-android-part-2-of-2/
我更喜欢第一种方法。 这样,您仍然可以访问Activity提供的上下文可能没有的其他方法。
您可以执行以下操作:公共类Create扩展SomethingThatRequiresASuper {
Create(Activity act){
this.activity = act;
super (act.getApplicationContext())
}
}
如果需要,可以声明上下文受保护。 那只是意味着该对象的范围是有限的。
不要宣布最终。 如果这样做,以后将无法更改上下文。
我认为过去的情况会很好。 而且,如果您在android框架中进行开发,则可以直接在View中使用属性'mContext',但这在SDK中不起作用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.