在 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 线程的队列中添加匿名可运行对象会导致内存泄漏吗?的主要内容,如果未能解决你的问题,请参考以下文章