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

时间:2011-02-16 13:43:09

标签: android android-asynctask

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

4 个答案:

答案 0 :(得分:2)

检查WeakAsyncTask以获取Google的一个示例,其中一个asynctask不会使活动生命周期之外的活动保持活跃状态​​,而来自DroidFu的BetterAsyncTask会提供一个连接AsyncTasks的方法示例,以便他们重新连接到新的活动实例(例如,在轮换之后);用法示例为here

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

如果任务的活动时间长了很长时间,则应将对活动上下文的所有引用设置为null。另见文章Avoiding Memory Leaks

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

答案 3 :(得分:0)

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

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