首页 > 解决方案 > 在 Handler 线程的队列中添加匿名可运行对象会导致内存泄漏吗?

问题描述

如果Activity VS ViewModel组件中存在此代码会导致内存泄漏吗?

    handlerThread = new HandlerThread("myHandlerThread");
    handlerThread.start();
    Handler handler = new Handler(handlerThread.getLooper());
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do work
        }
    }, 1000);

    @Override
protected void onDestroy() {
    super.onDestroy();
    handlerThread.quit();
}

用扩展 Runnable 的静态类替换匿名可运行类会有什么不同吗?这个视频教程中提到了@4:13 !

为什么匿名的 runnable 会持有对 Activity 或 ViewModel 的引用?

标签: androidandroid-handlerandroid-memoryandroid-handlerthreadandroid-threading

解决方案


在 Java 中,非静态内部类和匿名类包含对其外部类的隐式引用。另一方面,静态内部类则不然。

如果内部类的实例可能超过活动的生命周期,请避免在活动中使用非静态内部类。相反,更喜欢静态内部类并持有对内部活动的弱引用。

来源 1 来源 2

至于在 ViewModel 而不是 Activity 中做同样的事情,如果发生内存泄漏,如果 ViewModel 没有对应该被垃圾回收的内存密集型对象的引用,它的幅度会较小。但是,仍然可能存在内存泄漏威胁。

这个链接也很丰富

这个播放列表包含所有关于如何正确使用 Handlers/Threads/HandlerThreads


推荐阅读