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)に置き換えることを検討したほうが良い。