在 Handler 线程的队列中添加匿名可运行对象会导致内存泄漏吗?

Posted

技术标签:

【中文标题】在 Handler 线程的队列中添加匿名可运行对象会导致内存泄漏吗?【英文标题】:Can adding anonymous runnables in the queue of a Handler thread cause a memory leak? 【发布时间】:2021-04-04 12:05:33 【问题描述】:

如果 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 的静态类替换匿名可运行类会有什么不同吗?这在this 视频教程中提到了@4:13!

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

【问题讨论】:

【参考方案1】:

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

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

Source 1 Source 2

至于在 ViewModel 中而不是在 Activity 中执行相同操作,如果发生内存泄漏,则在 ViewModel 没有对应该被垃圾回收的内存密集型对象的引用的情况下,它的幅度会较小。但是,内存泄漏威胁仍然存在。

这个Link也很丰富

这个playlist 包含所有关于如何正确使用Handlers/Threads/HandlerThreads

【讨论】:

以上是关于在 Handler 线程的队列中添加匿名可运行对象会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章

Android--Handler的用法:在子线程中更新界面

什么是Handler

RibbitMQ 大数据分布式下的消息队列思

安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

Handler 消息传递机制

Android的handler机制的原理?