Home > Android > [Android] Handler内部クラス実装時の注意点

[Android] Handler内部クラス実装時の注意点

Handlerの派生クラスを内部クラスとして実装していると、
「This Handler class should be static or leaks might occur」
という警告が出てくることがあります。

この警告、Javaの仮想マシンの仕様によるものなのですが、リソースリークする可能性があることを示しています。
(原因詳細が気になる方は調べてみてください。)
 

とは言え、問題になるような場面はそうそうないと思われるので、よく分からない人は無視しても構わないと思います。
 

警告を消す方法

さて、ここからはお行儀の良いプログラムにする方法を紹介します。

まずはNGケースを見てみます。

1public class HogeActivity extends Activity {
2    private HogeHandler handler = new HogeHandler();
3 
4    ...
5    ...
6 
7 
8    /**
9     * Handler派生クラス
10     */
11    private class HogeHandler extends Handler {
12        @Override
13        public void handleMessage(Message msg) {
14            onHoge();
15        }
16    }
17 
18 
19    /**
20     * 外部クラスのメソッド
21     */
22    private void onHoge() {
23        ...
24    }
25}

 
このような実装をすると上記の警告が出るかと思います。
 

警告を消すには、Handler派生クラスをstaticなクラスとし、WeakReferenceにより外部クラスの弱参照を持つように実装します。

外部クラスのメソッド呼び出しは WeakReference#get() により取得した外部クラスのインスタンス経由で行うようにします。

1public class HogeActivity extends Activity {
2    private HogeHandler handler = new HogeHandler(this);
3 
4    ...
5    ...
6 
7 
8    /**
9     * Handler派生クラス
10     */
11    private class HogeHandler extends Handler {
12        private final WeakReference<HogeActivity> refHogeActivity;
13 
14 
15        /**
16         * コンストラクタ
17         */
18        public HogeHandler(HogeActivity hogeActivity) {
19            refHogeActivity = new WeakReference<HogeActivity>(hogeActivity);
20        }
21 
22 
23        @Override
24        public void handleMessage(Message msg) {
25            //==== インスタンス取得 ====//
26            HogeActivity activity = refHogeActivity.get();
27            if(activity == null) {
28                return;
29            }
30 
31 
32            //==== 外部クラスのメソッド呼び出し ====//
33            activity.onHoge();
34        }
35    }
36 
37 
38    /**
39     * 外部クラスのメソッド
40     */
41    private void onHoge() {
42        ...
43    }
44}

 

関連サイト

Developers:Handler
Developers:WeakReference
 
 

関連があると思われる記事:

このエントリーをはてなブックマークに追加
はてなブックマーク - [Android] Handler内部クラス実装時の注意点
Facebook にシェア
[`google_buzz` not found]
[`yahoo` not found]
[`livedoor` not found]
[`friendfeed` not found]
[`tweetmeme` not found]
[`grow` not found]

Comments:0

Comment Form
Remember personal info

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 ミライニトドケ

Home > Android > [Android] Handler内部クラス実装時の注意点

Search
Feeds
Meta
人気の記事

Return to page top