Handlerのまとめ
Handlerはandroidでメッセージの送信と処理を担当しています.主な用途は次のとおりです.
1)計画通りに将来のある時点でメッセージを送信するか、或いはあるRunnanbleを実行する(POST方法を使用する);2)他のスレッドから送信されたメッセージをメッセージキューに入れ、スレッドの競合を回避するためにタスクキューを行う(UIスレッドの更新が一般的)
デフォルトでは、Handlerは、現在のスレッドのメッセージループインスタンス(Handler(Looper looper)、Handler(Looper looper,Handler.Callback)を使用してスレッドを指定できる)を受け入れます.また、1つのメッセージキューは、現在のスレッド内の複数のペアによって配布され、しょり(UIスレッドでは、既にActivityが処理されているので、いくつかのHandlerを再起動して処理することができます).Handlerをインスタンス化する場合、Looperは任意のスレッドであってもよく、Handlerのポインタがあれば、どのスレッドでもsendMessageを読み取ることができます.HandlerはMessageの処理に対して同時ではありません.1つのLooperは1つのMessageを処理してから次のMessageを読み取ることができますメッセージの処理はブロック形式である(handleMessage()メソッドには時間のかかる操作があるべきではないので、時間のかかる操作を他のスレッドに置いて実行し、操作が終わったらMessageを送信し(sendMessageメソッドを介して)、handleMessage()によってUIを更新することができる).
システムのmusicのソースコードにはHandleThreadがカスタマイズされています.
脱退するとき
Looper LooperはHandlerとメッセージキューの間の通信ブリッジの役割を果たしています.プログラムコンポーネントはまずHandlerを介してLooperにメッセージを渡し,Looperはメッセージをキューに入れる.Looperもメッセージキュー内のメッセージをすべてのHandlerにブロードキャストし,Handlerはメッセージを受信してhandleMessageを呼び出して処理する.1)Looperクラスの静的メソッドLooper.myLooperは、現在のスレッドのLooperインスタンスを取得します.現在のスレッドにLooperインスタンスが関連付けられていない場合、このメソッドは空(null)を返します.ポインタの異常は空になりません.2)静的メソッドLooper.getMainLooperメソッドは、プライマリスレッドのLooperインスタンスを取得します.ここでは、プライマリスレッドのデフォルトにはLooperオブジェクトがあることに注意してください.しかし、私たち自身が定義したサブスレッドにはありません.では、どのようにしてサブスレッドでLooperオブジェクトを得るのでしょうか.スレッドでLooperを呼び出すとprepare()を使用すると、スレッドのメッセージキューが自動的に作成され、Looperが呼び出されます.loop();その後、メッセージループに入り、その後、メッセージを送信したり、メッセージを取得したり、メッセージを処理したりすることができます.このメッセージの送信方法とメッセージの処理方法は他のスレッドでHandleで行うことができますが、前提は私たちのHanleがこのサブスレッドのLooperを知っていることですが、サブスレッドでLooperを実行していない場合はmyLooper()は、一般的にサブスレッドのlooperは得られません.
同様にHandlerThreadで代用することができ、HandlerThreadはThreadに継承されるので、本質はThreadである.通常のThreadとの違いは、Looperメンバー変数があることです.このLooperは,メッセージキューおよびキュー処理ロジックのカプセル化であり,簡単に言えばメッセージキュー+メッセージループである.
リファレンスhttp://www.cnblogs.com/moonvan/archive/2011/04/22/2024979.html
1)計画通りに将来のある時点でメッセージを送信するか、或いはあるRunnanbleを実行する(POST方法を使用する);2)他のスレッドから送信されたメッセージをメッセージキューに入れ、スレッドの競合を回避するためにタスクキューを行う(UIスレッドの更新が一般的)
デフォルトでは、Handlerは、現在のスレッドのメッセージループインスタンス(Handler(Looper looper)、Handler(Looper looper,Handler.Callback)を使用してスレッドを指定できる)を受け入れます.また、1つのメッセージキューは、現在のスレッド内の複数のペアによって配布され、しょり(UIスレッドでは、既にActivityが処理されているので、いくつかのHandlerを再起動して処理することができます).Handlerをインスタンス化する場合、Looperは任意のスレッドであってもよく、Handlerのポインタがあれば、どのスレッドでもsendMessageを読み取ることができます.HandlerはMessageの処理に対して同時ではありません.1つのLooperは1つのMessageを処理してから次のMessageを読み取ることができますメッセージの処理はブロック形式である(handleMessage()メソッドには時間のかかる操作があるべきではないので、時間のかかる操作を他のスレッドに置いて実行し、操作が終わったらMessageを送信し(sendMessageメソッドを介して)、handleMessage()によってUIを更新することができる).
システムのmusicのソースコードにはHandleThreadがカスタマイズされています.
private static class Worker implements Runnable {
private final Object mLock = new Object();
private Looper mLooper;
/**
* Creates a worker thread with the given name. The thread
* then runs a {@link android.os.Looper}.
* @param name A name for the new thread
*/
Worker(String name) {
Thread t = new Thread(null, this, name);
t.setPriority(Thread.MIN_PRIORITY);
t.start();
synchronized (mLock) {
while (mLooper == null) {
try {
mLock.wait();
} catch (InterruptedException ex) {
}
}
}
}
public Looper getLooper() {
return mLooper;
}
public void run() {
synchronized (mLock) {
Looper.prepare();
mLooper = Looper.myLooper();
mLock.notifyAll();
}
Looper.loop();
}
public void quit() {
mLooper.quit();
}
}
初期化時 mAlbumArtWorker = new Worker("album art worker");
mAlbumArtHandler = new AlbumArtHandler(mAlbumArtWorker.getLooper());
脱退するとき
@Override
public void onDestroy()
{
mAlbumArtWorker.quit();
super.onDestroy();
//System.out.println("***************** playback activity onDestroy
");
}
Looper LooperはHandlerとメッセージキューの間の通信ブリッジの役割を果たしています.プログラムコンポーネントはまずHandlerを介してLooperにメッセージを渡し,Looperはメッセージをキューに入れる.Looperもメッセージキュー内のメッセージをすべてのHandlerにブロードキャストし,Handlerはメッセージを受信してhandleMessageを呼び出して処理する.1)Looperクラスの静的メソッドLooper.myLooperは、現在のスレッドのLooperインスタンスを取得します.現在のスレッドにLooperインスタンスが関連付けられていない場合、このメソッドは空(null)を返します.ポインタの異常は空になりません.2)静的メソッドLooper.getMainLooperメソッドは、プライマリスレッドのLooperインスタンスを取得します.ここでは、プライマリスレッドのデフォルトにはLooperオブジェクトがあることに注意してください.しかし、私たち自身が定義したサブスレッドにはありません.では、どのようにしてサブスレッドでLooperオブジェクトを得るのでしょうか.スレッドでLooperを呼び出すとprepare()を使用すると、スレッドのメッセージキューが自動的に作成され、Looperが呼び出されます.loop();その後、メッセージループに入り、その後、メッセージを送信したり、メッセージを取得したり、メッセージを処理したりすることができます.このメッセージの送信方法とメッセージの処理方法は他のスレッドでHandleで行うことができますが、前提は私たちのHanleがこのサブスレッドのLooperを知っていることですが、サブスレッドでLooperを実行していない場合はmyLooper()は、一般的にサブスレッドのlooperは得られません.
同様にHandlerThreadで代用することができ、HandlerThreadはThreadに継承されるので、本質はThreadである.通常のThreadとの違いは、Looperメンバー変数があることです.このLooperは,メッセージキューおよびキュー処理ロジックのカプセル化であり,簡単に言えばメッセージキュー+メッセージループである.
HandlerThread handlerThread = new HandlerThread("threadone");
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
リファレンスhttp://www.cnblogs.com/moonvan/archive/2011/04/22/2024979.html