查看WeakAsyncTask以获取Google的异步任务示例,该示例不会在活动生命周期之外保留引用,以及DroidFu的BetterAsyncTask作为一种将AsyncTasks连接到新活动实例(例如旋转后)的方法;使用示例在此处。
保留Activity引用进行短操作(例如单个小型Web请求或小文件写入)可能没有太大的危害,但如果可能导致任务堆积,则可能会导致问题。例如,如果您的应用在创建时从服务器读取一个大小为200KB的XML文件,假设在EDGE上需要1分钟或更长时间,快速打开/关闭手机3或4次可能会导致4个保留的Activity实例 - 在这种情况下,您可能很快就会耗尽内存,更不用说重复的工作了。
对于任何真正长时间运行的进程,您应该考虑使用IntentService而不是AsyncTask。它们专为较长时间运行的进程设计,这些进程与特定活动没有太大关联-就像您可以发送MMS并离开该活动去做其他事情一样,每当任务完成时,您都会得到一个愉快的信息提示。
如果任务在您的Activity完成后不久就会自行进行垃圾回收,那么保留引用应该没有问题。
如果任务在活动结束后仍需要一段时间才能完成,您应将所有对Activity Context的引用设置为null。另请参阅文章避免内存泄漏。
无论如何,最好的做法是尽可能使用Application Context(getApplicationContext()
)而不是Activity Context。在这种情况下,您不能这样做,因为您需要发布UI消息;我只是为了完整性而提到它。
您可以使用弱引用来保持上下文引用。http://developer.android.com/reference/java/lang/ref/WeakReference.html
弱引用对象可以被垃圾回收。每次使用它时,您应该检查上下文引用是否仍然有效。