AndroidでHandler looperパラメータ設定について
1697 ワード
Android開発ではHandlerがよく使われていますが、HandlerはAndroidの非同期コールバックメカニズムで、handlerが実行するにはLooperに基づいて実現する必要があります.基本的な使い方はここでは議論しません.
主によくあるHandlerの使用問題について話します.
次のHandlerの作成と初期化を簡単に見ることができます.
このHandler作成は、メインスレッドとサブスレッドで大きな違いがあり、サブスレッドに作成された場合、それ自体がUIスレッドを更新することができず、UIスレッドを更新するとエラーが報告され、メインスレッドに作成された場合、
中には時間のかかる操作もあればUIも付きます.だからHanlderを使うにはいくつかのこだわりがあります.
1.メインスレッドにHandlerを作成しますが、時間がかかります.
このとき、HandlerThreadを作成してこのHandlerをサポートする必要があります.コードは次のとおりです.
(表示が便利で、異常スナップコードは削除されています)
これにより、マスタースレッドを占有するLooperやカードマスタースレッドUIがなくなる
2.サブスレッドにHandlerを作成する
サブスレッドで作成使用、HandlerThreadが作成されていない場合は、直接使用するとLooperが報告されません.prepare()のエラー
直接呼び出すことができます.
LooperのgetMainLooperによってメインスレッドのLooperを取得することで、それ自体がUIを更新することができる.
ただし、時間のかかる操作はできないことが前提です
3.Activity終了について
Activityが終了した場合はHandlerを閉じ、新しいHandlerThreadが作成された場合は呼び出しを忘れないでください
handlerThread.quit();で行ないます.
Hanlder自体はremoveCallbacksとremoveMessagesを呼び出して操作を終了する必要があります.
主によくある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を呼び出して操作を終了する必要があります.