如果我们使用非静态处理程序,则会出现警告:'处理程序应该是静态的,否则很容易出现内存泄漏。'
我已阅读以下链接,我知道他们的意思。
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
。当Looper
处理消息时,msg
将被调度到Handler
(target
引用),之后,msg将被回收。
Message.recycle()方法调用Message.clearForRecycle()方法,我们看到:
...
target = null;
...
target
设置为null
,这意味着Message
不包含对Handler
的引用。非静态Handler
将被GC,并且Activity
和View
都将被GC。
所以我的问题是,为什么会发生内存泄漏?