Handlerの派生クラスを内部クラスとして実装していると、
「This Handler class should be static or leaks might occur」
という警告が出てくることがあります。
この警告、Javaの仮想マシンの仕様によるものなのですが、リソースリークする可能性があることを示しています。
(原因詳細が気になる方は調べてみてください。)
とは言え、問題になるような場面はそうそうないと思われるので、よく分からない人は無視しても構わないと思います。
警告を消す方法
さて、ここからはお行儀の良いプログラムにする方法を紹介します。
まずはNGケースを見てみます。
1 | public class HogeActivity extends Activity { |
2 | private HogeHandler handler = new HogeHandler(); |
11 | private class HogeHandler extends Handler { |
13 | public void handleMessage(Message msg) { |
22 | private void onHoge() { |
このような実装をすると上記の警告が出るかと思います。
警告を消すには、Handler派生クラスをstaticなクラスとし、WeakReferenceにより外部クラスの弱参照を持つように実装します。
外部クラスのメソッド呼び出しは WeakReference#get() により取得した外部クラスのインスタンス経由で行うようにします。
1 | public class HogeActivity extends Activity { |
2 | private HogeHandler handler = new HogeHandler( this ); |
11 | private class HogeHandler extends Handler { |
12 | private final WeakReference<HogeActivity> refHogeActivity; |
18 | public HogeHandler(HogeActivity hogeActivity) { |
19 | refHogeActivity = new WeakReference<HogeActivity>(hogeActivity); |
24 | public void handleMessage(Message msg) { |
26 | HogeActivity activity = refHogeActivity.get(); |
27 | if (activity == null ) { |
41 | private void onHoge() { |
関連サイト
Developers:Handler
Developers:WeakReference
関連があると思われる記事:
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`grow` not found]