AndroidでHandler looperパラメータ設定について

1697 ワード

Android開発ではHandlerがよく使われていますが、HandlerはAndroidの非同期コールバックメカニズムで、handlerが実行するにはLooperに基づいて実現する必要があります.基本的な使い方はここでは議論しません.
主によくあるHandlerの使用問題について話します.
次のHandlerの作成と初期化を簡単に見ることができます.
private Handler  handler = new Handler(){
		    @Override
	        public void dispatchMessage(Message msg) {
	            switch (msg.what) {
	                case MY_MSG1: {
<span style="white-space:pre">			</span> //DO something
	                    break;
	                }
	                default:
	                    break;
	            }
	        }
	};

このHandler作成は、メインスレッドとサブスレッドで大きな違いがあり、サブスレッドに作成された場合、それ自体がUIスレッドを更新することができず、UIスレッドを更新するとエラーが報告され、メインスレッドに作成された場合、
中には時間のかかる操作もあればUIも付きます.だからHanlderを使うにはいくつかのこだわりがあります.
1.メインスレッドにHandlerを作成しますが、時間がかかります.
このとき、HandlerThreadを作成してこのHandlerをサポートする必要があります.コードは次のとおりです.
(表示が便利で、異常スナップコードは削除されています)
		handlerThread = new HandlerThread("mydefine.handler"); 
		handlerThread.start();
		Looper lp = handlerThread.getLooper();
		handler = new Handler(lp);

これにより、マスタースレッドを占有するLooperやカードマスタースレッドUIがなくなる
2.サブスレッドにHandlerを作成する
サブスレッドで作成使用、HandlerThreadが作成されていない場合は、直接使用するとLooperが報告されません.prepare()のエラー
直接呼び出すことができます.
handler = new Handler(Looper.getMainLooper());

LooperのgetMainLooperによってメインスレッドのLooperを取得することで、それ自体がUIを更新することができる.
ただし、時間のかかる操作はできないことが前提です
3.Activity終了について
Activityが終了した場合はHandlerを閉じ、新しいHandlerThreadが作成された場合は呼び出しを忘れないでください
handlerThread.quit();で行ないます.
Hanlder自体はremoveCallbacksとremoveMessagesを呼び出して操作を終了する必要があります.