Handlerのリーク警告を解決するには
たとえば、こんなコードを書いたとする。
「Handlerはstaticにしないとリークするよ!」と注意される。
This Handler class should be static or leaks might occur
解決
(a) static内部クラスにする
単純にstatic内部クラスに置き換えることができるのならば、手っ取り早く解決できる。
でも、static内部クラスにすると、staticメソッドしか使えない。
Activityのインスタンスを持っておくと、非staticメソッドも使えるようになる。
ただし、GCが回収できるようにActivityへのWeakReference
Activityが終了してGC回収済みの場合に備えてnullチェックしておく。
(b) Handler.Callbackクラスを実装する
注意: この方法はLint警告を回避できますが、リークの可能性は解決しません。
メッセージを処理した場合はtrueを返すこと。
- trueを返すと、HandlerのhandleMessageが呼ばれない。
- falseを返すと、HandlerのhandleMessageが呼ばれる。
Google先生、リファレンスにちゃんと書いてください。
原理
「どうしてリークするぞ、なんて脅されるの(´;ω;`)」と思ったら...
まず、adamrockerさんの記事をよーく読んで、Handlerの仕組みを理解する。
次に、glayashさんの記事をよーく読んで、Handlerのリークの仕組みを理解する。
簡単に言うと、アクティビティが終了しても、HanderがActivityへの参照を持っているから、GCが回収してくれない。
関連記事
例のように、単純なHandler#post(Runnable)は、Activity#runOnUiThread(Runnable)に置き換えることを検討したほうが良い。