非静的ハンドラーを使用する場合は警告があります。「ハンドラーは静的である必要があります。そうでない場合、メモリリークが発生しやすくなります。」
私は以下のリンクを読みました、そして私はそれらが何を意味するかを知っています。
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
付けられた参照を保持します。メッセージがによって処理されると、 (参照)にディスパッチされ、その後、msgがリサイクルされます。target
Handler
Looper
msg
Handler
target
Message.recycle()メソッドはMessage.clearForRecycle( )メソッドを呼び出します。その中で、次のようになります。
...
target = null;
...
target
に設定されてnull
いる、つまり、Message
への参照を保持していませんHandler
。非静的Handler
がGCされ、との両方Activity
がView
GCされます。
だから私の質問は、なぜメモリリークが発生する可能性があるのかということです。