android - 这个 Handler 还会泄露 Context 吗?

标签 android android-context android-handler

我知道如果你直接初始化一个 Handler 并在 Activity 中使用它,它会泄漏 Context(由 Alex Lockwood 提供) ,例如

public class SampleActivity extends Activity {

  private final Handler mLeakyHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
      /* ... */
    }
  }
}

所以我使用了下面的方法

private static class StaticHandler extends Handler {

    private final WeakReference<SampleActivity> mSampleAct;

    private StaticHandler(SampleActivity act) {
        mSampleAct = new WeakReference<SampleActivity>(
                act);
    }

}

然后我初始化如下

 public class SampleActivity extends Activity {
    private Handler myHandler = new StaticHandler(this) {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            processTask(msg.obj);
        }
    };
}

我想知道我的 Handler 即 myHandler 是否仍会泄漏 Context,我如何确定它不会泄漏?

最佳答案

使用 WeakReference 绝对是避免内存泄漏的明智方法。代码在上下文之外对我来说看起来不错,但确保它不会泄漏内存的最佳方法是使用 DDMS 内存分析器。阅读更多:Memory Analyzer Tool in android?

关于android - 这个 Handler 还会泄露 Context 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15138011/

相关文章:

android - 执行doInBackground()时出现java.lang.RuntimeException错误如何解决?

android - Handler.sendMessageDelayed(msg, delay) 无法正常工作

android - getItemId 与菜单项不匹配

java - 在 Android Java 中传递上下文并不好,但是如何访问服务中的 Activity 呢?

javascript - DOMException : play() can only be initiated by a user gesture

android - 为什么 Picasso 不使用 imageView.getContext()?

java - 从 SurfaceView 内部启动 Activity

android - 在获得时间选择器和当前时间之间的时间延迟后使用 postDelayed 安排任务

android - 网页上的图像在 Android 8/9 上的 Chrome 78 上不可见(但在 Chrome 76 和 Android 10 上工作)——可能是什么问题?

安卓 : JNI Java From C Memory Leak