当前位置: 首页 > 编程笔记 >

Android 避免使用AsyncTask泄漏活动

尹善
2023-03-14
本文向大家介绍Android 避免使用AsyncTask泄漏活动,包括了Android 避免使用AsyncTask泄漏活动的使用技巧和注意事项,需要的朋友参考一下

示例

注意:AsyncTask除了这里描述的内存泄漏之外,还有很多陷阱。因此,请谨慎使用此API,如果您不完全了解其含义,请完全避免使用它。有很多选择(线程,EventBus,RxAndroid等)。

一个常见的错误AsyncTask是捕获对主机Activity(或Fragment)的强烈引用:

class MyActivity extends Activity {
  private AsyncTask<Void, Void, Void> myTask = new AsyncTask<Void, Void, Void>() {
    //不要这样!内部类隐式保留指向它们的指针
    // 父级,在这种情况下就是活动!
  }
}

这是一个问题,因为AsyncTask它很容易超过父级Activity,例如,如果在任务运行时发生配置更改。

正确的方法是使您的任务成为一个static类,该类不捕获父类,并持有对宿主的弱引用Activity:

class MyActivity extends Activity {
  static class MyTask extends AsyncTask<Void, Void, Void> {
    // 弱引用将仍然允许对活动进行垃圾收集
    private final WeakReference<MyActivity> weakActivity;

    MyTask(MyActivity myActivity) {
     this.weakActivity= new WeakReference<>(myActivity);
    }

    @Override
    public Void doInBackground(Void... params) {
      // 在这里做异步的事情
    }

    @Override
    public void onPostExecute(Void result) {
      // 重新获得对该活动的强烈引用,并进行验证
      // 它仍然存在并处于活动状态。
      MyActivity activity = weakActivity.get();
      if (activity == null
          || activity.isFinishing()
          || activity.isDestroyed()) {
        // 活动已不再有效,请勿执行任何操作!
        return;
      }

      // 该活动仍然有效,请在此处执行主线程操作
    }
  }
}
           

 类似资料:
  • 我是android开发的新手,我刚刚从以下链接读到了Romain Guy的“避免android内存泄漏” http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/ 然后我在我的android模拟器上用他著名的代码片段做了一个小测试 此代码应该在更改方向时泄漏第一个活动上下文。因此,我在emulator中运行了

  • 我在SupportMapFragmet上阅读了这篇文档,它说: 从GoogleMap获得的任何对象都与视图相关联。重要的是不要持有超出视图生命周期的对象(例如标记)。否则会导致内存泄漏,因为视图无法释放。 我对此有点困惑,因为没有办法修改,除非您持有它们的引用,就像这里的许多问题所说的那样(像这样和这样)......所以我错过了什么吗? 我目前正在使用哈希映射将我的标记与其他对象关联起来,我看不出

  • 问题内容: 有效的Java说: 内存泄漏的第三个常见来源是侦听器和其他回调。如果在客户端注册回调但未显式注销的情况下实现API,除非您采取某些措施,否则它们会累积。确保回调被及时垃圾回收的最佳方法是仅存储对其的弱引用,例如,通过仅将它们作为键存储在WeakHashMap中。 我是Java的初学者。有人可以教我如何在回调中创建弱引用,并告诉我它们如何解决内存泄漏问题吗?谢谢。 问题答案: 阅读这篇文

  • 问题内容: 所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下: 在倒数第二行中,从不释放而是返回,是否会导致最终的内存泄漏?反正有解决这个问题的方法吗? 还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“ errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的

  • 我读了很多关于如何避免Android内存泄漏的文章,但我仍然不太确定我是否做对了。 我的应用程序由一个活动组成 问题1:这够了吗? 让我困惑的是,你可以在网上找到一个经典的“不去”的例子(http://www.curious-creature.org/2008/12/18/avoid-memory-leaks-on-android/): 我认为,一旦创建完成, 检索上下文,将其传递给手动创建的查看

  • 我在android fragment中找到了许多避免内存泄漏的方法,但哪种方法是最好的? 1.将视图设置为null时onDestRoyView被调用 2.将所有子视图设置为null并删除该视图