当我的Activity完成时,我应该将活动上下文的引用设置为null吗?

3
当我的Activity结束时,将Activity Context的引用设置为null是一个好习惯吗?我有3个AsyncTask,每个任务可以同时运行多个实例。它们在onPostExecute()中更新UI。在onDestroy()中将所有Activity Context引用设置为null会很困难,并且让代码变得混乱。那么最好的做法是什么?
4个回答

2

查看WeakAsyncTask以获取Google的异步任务示例,该示例不会在活动生命周期之外保留引用,以及DroidFu的BetterAsyncTask作为一种将AsyncTasks连接到新活动实例(例如旋转后)的方法;使用示例在此处

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

对于任何真正长时间运行的进程,您应该考虑使用IntentService而不是AsyncTask。它们专为较长时间运行的进程设计,这些进程与特定活动没有太大关联-就像您可以发送MMS并离开该活动去做其他事情一样,每当任务完成时,您都会得到一个愉快的信息提示。


1
不要保留长期引用上下文活动(对活动的引用应该具有与活动本身相同的生命周期)。尝试使用上下文应用程序而不是上下文活动。如果由于内存问题不需要相反的引用,则无需将引用设置为null。

1

如果任务在您的Activity完成后不久就会自行进行垃圾回收,那么保留引用应该没有问题。

如果任务在活动结束后仍需要一段时间才能完成,您应将所有对Activity Context的引用设置为null。另请参阅文章避免内存泄漏

无论如何,最好的做法是尽可能使用Application Context(getApplicationContext())而不是Activity Context。在这种情况下,您不能这样做,因为您需要发布UI消息;我只是为了完整性而提到它。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接