繁体   English   中英

当我的Activity完成时,我应该对活动上下文的引用空吗?

[英]Should I null references to Activity Context, when my Activity finishes?

当我的Activity完成时,对活动上下文的引用是否是一个好习惯? 我有3个AsyncTask,每个都可以同时在多个实例中运行。 在onPostExecute()中更新UI。 在onDestroy()中取消所有活动上下文引用将非常困难并使代码变得混乱。 什么是最好的事情?

检查WeakAsyncTask从不保持引用活着超出了活动的生命周期的的AsyncTask的谷歌,并举例BetterAsyncTask从DroidFu对的方式来连线AsyncTasks,使他们能够重新连接到新的活动实例(旋转之后,例如一个例子); 用法示例在这里

对于短操作(例如,单个小型Web请求或小文件写入)保持对Activity的引用可能没有太大的危害,但是如果任务可能堆积起来,则可能导致问题。 例如,如果您的应用程序在创建时从服务器读取200KB XML文件,比起EDGE需要1分钟或更长时间,快速翻转手机打开/关闭3或4次可能会导致4个保留的Activity实例 - - 在这种情况下,你可以很快耗尽内存,更不用说重复的工作了。

但是,对于任何真正长时间运行的进程,您应该考虑使用IntentService而不是AsyncTask。 它们专为长期运行的流程而设计,这些流程与特定的活动并不紧密相关 - 比如你如何发送彩信并让活动去做其他事情,你会得到一个愉快的祝酒,告诉你完成任务一旦完成。

不要长期保持对上下文活动的引用(对活动的引用应该与活动本身具有相同的生命周期)。 尝试使用context-application而不是context-activity。 由于存储器故障,当您不需要相反时,不需要取消引用。

如果任务在您的活动完成后不久就有资格进行垃圾收集,我认为保持引用没有问题。

如果任务的活动时间长了很长时间,则应将对活动上下文的所有引用设置为null。 另请参阅文章避免内存泄漏

无论哪种方式,最好尽可能使用Application Context( getApplicationContext() )而不是Activity Context。 在这种情况下,您无法执行此操作,因为您需要发布UI消息; 我只是提到它的完整性。

您可以使用弱引用来保存上下文引用。 http://developer.android.com/reference/java/lang/ref/WeakReference.html

弱引用对象可以是GC'd。 您应该检查每次使用它时上下文引用是否仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM