1

非静的ハンドラーを使用する場合は警告があります。「ハンドラーは静的である必要があります。そうでない場合、メモリリークが発生しやすくなります。」

私は以下のリンクを読みました、そして私はそれらが何を意味するかを知っています。

https://stackoverflow.com/a/7909437/619424
https://stackoverflow.com/a/11336822/619424

しかし、Handler.javaMessage.javaLooper.javaのソースを読んだ後、私は混乱しています...

Looper.loop ()メソッドでは、以下のステートメントを確認できます。

msg.target.dispatchMessage(msg);

...

msg.recycle();

変数は、対応するに名前がmsg付けられた参照を保持します。メッセージがによって処理されると、 (参照)にディスパッチされ、その後、msgがリサイクルされます。targetHandlerLoopermsgHandlertarget

Message.recycle()メソッドはMessage.clearForRecycle( )メソッドを呼び出します。その中で、次のようになります。

...

target = null;

...

targetに設定されてnullいる、つまり、Messageへの参照を保持していませんHandler。非静的HandlerがGCされ、との両方ActivityViewGCされます。

だから私の質問は、なぜメモリリークが発生する可能性があるのか​​ということです。

4

0 に答える 0