【问题标题】:Android context leaks in AsyncTaskAsyncTask 中的 Android 上下文泄漏
【发布时间】:2010-11-18 23:13:13
【问题描述】:

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

您如何处理AsyncTasks 中不是内部类且需要访问资源或更新 UI 的问题?

此外,如果您需要引用进度对话框来关闭它们,如何避免泄露上下文?

【问题讨论】:

  • this。它是关于方向变化的,但这涉及安全地保持对活动/上下文的引用。

标签: android memory-leaks android-asynctask android-context


【解决方案1】:

如果我正确理解您的问题: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();

【讨论】:

  • 只要确保 myWeakContext.get() 不返回 null,否则你搞砸了。
  • 如果您在任务完成后不需要严格执行 UI 更新,则此方法有效。如果在重新创建活动后需要异步任务的结果,则需要使用不同的方法。设置为保留状态的无头片段可以管理您的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2018-02-08
  • 2013-10-09
  • 2019-08-16
  • 1970-01-01
  • 2019-02-13
相关资源
最近更新 更多