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がカスタマイズされています.
    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