- 2012-12-15 (土) 20:37
- Android
Handlerの派生クラスを内部クラスとして実装していると、
「This Handler class should be static or leaks might occur」
という警告が出てくることがあります。
この警告、Javaの仮想マシンの仕様によるものなのですが、リソースリークする可能性があることを示しています。
(原因詳細が気になる方は調べてみてください。)
とは言え、問題になるような場面はそうそうないと思われるので、よく分からない人は無視しても構わないと思います。
警告を消す方法
さて、ここからはお行儀の良いプログラムにする方法を紹介します。
まずはNGケースを見てみます。
public class HogeActivity extends Activity { private HogeHandler handler = new HogeHandler(); ... ... /** * Handler派生クラス */ private class HogeHandler extends Handler { @Override public void handleMessage(Message msg) { onHoge(); } } /** * 外部クラスのメソッド */ private void onHoge() { ... } }
このような実装をすると上記の警告が出るかと思います。
警告を消すには、Handler派生クラスをstaticなクラスとし、WeakReferenceにより外部クラスの弱参照を持つように実装します。
外部クラスのメソッド呼び出しは WeakReference#get() により取得した外部クラスのインスタンス経由で行うようにします。
public class HogeActivity extends Activity { private HogeHandler handler = new HogeHandler(this); ... ... /** * Handler派生クラス */ private class HogeHandler extends Handler { private final WeakReference<HogeActivity> refHogeActivity; /** * コンストラクタ */ public HogeHandler(HogeActivity hogeActivity) { refHogeActivity = new WeakReference<HogeActivity>(hogeActivity); } @Override public void handleMessage(Message msg) { //==== インスタンス取得 ====// HogeActivity activity = refHogeActivity.get(); if(activity == null) { return; } //==== 外部クラスのメソッド呼び出し ====// activity.onHoge(); } } /** * 外部クラスのメソッド */ private void onHoge() { ... } }
関連サイト
Developers:Handler
Developers:WeakReference
関連があると思われる記事:
- [Android] マルチスレッド(その1)
- [C#] overrideとnewの違い
- [Android] メニュー処理
- [Android] Backボタンが押されたときの処理
- [C++] クラスのメモリコピーにはご用心
- Newer: [Java] 乱数
- Older: [Java] 経過日数の取得
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://gacken.com/wp/program/android/2200/trackback/
- Listed below are links to weblogs that reference
- [Android] Handler内部クラス実装時の注意点 from ミライニトドケ