There is a warning if we use non-static Handler: 'handler should be static, else it is prone to memory leaks.'
I have read below links and I know what their mean.
https://stackoverflow.com/a/7909437/619424
https://stackoverflow.com/a/11336822/619424
But after read the source of Handler.java, Message.java and Looper.java, I'm confused...
In Looper.loop() method, we can see below statements:
msg.target.dispatchMessage(msg);
...
msg.recycle();
the variable msg
holds a reference named target
to a corresponding Handler
. When a Message is proceessed by Looper
, msg
is dispatched to the Handler
(target
reference), after that, msg is recycled.
Message.recycle() method calls Message.clearForRecycle() method, in that, we see:
...
target = null;
...
target
is set to null
, that means, Message
doesn't holds the reference to Handler
. Non-static Handler
will be GCed, and both Activity
and View
s will be GCed.
So my question is, why there might a memory leak occurs?