问题 Android上下文在AsyncTask中泄漏


如果我解释这个 文章 正确地,将活动上下文传递给 AsyncTasks 是潜在的泄漏,因为在任务仍在运行时可能会破坏活动。

你是如何处理这个问题的? AsyncTasks 那些不是内部契约,需要访问资源或更新UI?

另外,如果需要引用进度对话框来解除它们,如何避免泄露上下文?


7764
2017-11-18 23:13


起源

看着 这个。它涉及方向更改,但这涉及安全地保持对活动/上下文的引用。 - Kevin Gaudin


答案:


如果我理解你的问题:Java的WeakReference或SoftReference类非常适合这种情况。它允许您将上下文传递给AsyncTask,而不会阻止GC在必要时释放上下文。

收集WeakReferences时,GC比收集SoftReferences时更加渴望。

代替:

FooTask myFooTask = new FooTask(myContext);

你的代码看起来像:

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

并在AsyncTask而不是:

myContext.someMethod();

你的代码看起来像:

myWeakContext.get().someMethod();

12
2017-11-18 23:30



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