Android中AsyncTask中的上下文泄漏问题

13
如果我正确理解这篇文章的话,将活动上下文传递给AsyncTasks可能会导致内存泄漏,因为在任务仍在运行时,活动可能已被销毁。
对于不是内部类且需要访问资源或更新UI的AsyncTasks,应该如何处理呢?
另外,如果需要引用进度对话框以关闭它们,如何避免泄漏上下文呢?

看看这个。它是关于方向变化,但是这个问题涉及到安全地保持对活动/上下文的引用。 - Kevin Gaudin
1个回答

14
如果我理解你的问题正确:Java的WeakReference或SoftReference类非常适合这种情况。它将允许你将上下文传递给AsyncTask,而不会阻止GC在必要时释放上下文。
GC在收集WeakReferences时比收集SoftReferences更积极。
而不是:
FooTask myFooTask = new FooTask(myContext);

您的代码将如下所示:

WeakReference<MyContextClass> myWeakContext = new WeakReference<MyContextClass>(myContext);
FooTask myFooTask = new FooTask(myWeakContext);

在AsyncTask中,而不是:

myContext.someMethod();

您的代码将如下所示:

myWeakContext.get().someMethod();

5
请确保myWeakContext.get()不返回null,否则你就完了。 - Radu Comaneci
如果您在任务完成后不需要严格执行UI更新,则此方法可行。如果需要在重新创建活动后使用异步任务的结果,则需要采用不同的方法。设置为保留状态的无界面片段可以管理您的任务。 - r1k0

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