如果我们使用非静态 Handler 会有一个警告:'handler 应该是静态的,否则容易出现内存泄漏。
我已阅读以下链接,并且知道它们的含义。
https://stackoverflow.com/a/7909437/619424
https://stackoverflow.com/a/11336822/619424
但是在阅读了Handler.java、Message.java和Looper.java的来源之后,我很困惑......
在Looper.loop()方法中,我们可以看到以下语句:
msg.target.dispatchMessage(msg);
...
msg.recycle();
该变量msg
包含一个名为target
对应的引用Handler
。当 Message 被Looper
,msg
调度到Handler
( target
reference) 时,msg 被回收。
Message.recycle()方法调用Message.clearForRecycle()方法,我们看到:
...
target = null;
...
target
设置为null
,这意味着,Message
不包含对 的引用Handler
。非静态Handler
将被 GC,Activity
和View
s 都将被 GC。
所以我的问题是,为什么会发生内存泄漏?