android handler,looper,messageQueue重点記録

4194 ワード

UIスレッド
プログラムが最初に起動すると、AndroidはUIに関連するイベントを処理するメインスレッド(Main Thread)を同時に起動します.UIスレッドと呼ばれます.
なぜhandlerを使うのか
簡単に言えば、メインスレッドキューが1つのメッセージを5秒以上処理するとandroidはANP(応答なし)の異常を放出するので、比較的長いメッセージを処理し、1つの個別スレッドの中に置いて処理し、処理後の結果をメインスレッドに戻して実行するには、Handlerを使用してスレッド構築の通信を行う必要があります.
handler単純使用
private Handler handler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO          UI        
            if (msg.what == UPDATE) {
                //       textview
                tv.setText(String.valueOf(msg.obj));
            }
            super.handleMessage(msg);
        }
    };
new Thread() {
            @Override
            public void run() {
                // TODO       handler     handler  , handler   TextView  
                try {
                       //do something

                        Message msg = new Message();
                        msg.what = UPDATE;                  
                        msg.obj = "     " ;
                        handler.sendMessage(msg);
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();

HandlerのhandleMessageメソッド
  • Hanlderの構造関数にHandlerを入力.Callbackオブジェクト、そしてHandlerを実現する.CallbackのhandleMessageメソッド
  • HanlderのコンストラクタにHandlerを伝達する必要はない.Callbackオブジェクトですが、Handler自体のhandleMessageメソッド
  • を書き換える必要があります.
    Looper簡単な説明
    メインスレッドでHandlerを宣言するには、Threadクラスを継承して独自のスレッド機能を実現する必要がある場合があります.Handlerを宣言すると、エラーが発生します.これは,主スレッドにおいて2つの重要なLooper法が実装されているためである.
    まずlooperオブジェクトを空にすることはできません.つまり、loop()メソッド呼び出しはprepare()メソッドの後ろにある必要があります.
    LooperはメッセージキューからMessageQueueのnextメソッドでMessageを取得し、その後コードmsg.target.dispatchMessage(msg)は、このmsgにバインドされたHandler(Message.target)にdispatchMessageメソッドを実行させ、Messageの処理を実現させる.
    サブスレッドでHandlerを簡単に使用
    Handlerの本質は、現在のスレッドからLooperを取得してMessageQueueをリスニングおよび操作し、他のスレッドの実行が完了すると現在のスレッドをコールバックすることである.Looperを取得するにはサブスレッドが先にprepare()を必要とするのは、サブスレッドが通常のスレッドであるため、そのThreadLoaclにLooperが設定されていないため、異常が投げ出され、Looperのprepare()メソッドではsThreadLocal.set(new Looper()はLooperが設定されています.
    class Rub implements Runnable {  
    
            public Handler myHandler;  
            //   Runnable       
            @Override  
            public void run() {  
    
             /*①、  Looper prepare()         Looper   ,
                Looper   ,               MessageQueue*/
                Looper.prepare();  
    
                /*.②、  Handler     ,  HandleMessage()  ,                 */
                 myHandler = new Handler() {  
                    @Override  
                    public void handleMessage(Message msg) {  
                        String ms = "";  
                        if (msg.what == 0x777) {  
    
                        }  
                    }  
    
                };  
                //③、  Looper loop()     Looper         
                Looper.loop();  
            }
        }
    

    注意は3つのステップに分けられます.
    1.Looperを呼び出すprepare()メソッドは、現在のスレッドに対してLooperオブジェクトを作成し、Looperオブジェクトを作成すると、そのコンストラクタによってMessageQueueが作成されます.
    2.Looperが作成された後、Handlerサブクラスインスタンスを作成し、他のスレッドからのメッセージの処理を担当するHanderMessage()メソッドを書き換える.
    3.Looperのlooper()メソッドを呼び出してLooperを起動します.
    このhandlerインスタンスを使用して他のスレッドでメッセージを送信すると、最終的にメッセージを処理するコードがHandlerインスタンスを作成するスレッドで実行されます.
    まとめ:Handler:**Looper管理のMessageQueueにメッセージを送信できます.**メッセージを処理し、Looperが割り当てたメッセージを処理します.**Message:**Handlerが受信および処理したメッセージ・オブジェクト.**Looper:**各スレッドには1つのLooperしかありません.それは対応するMessageQueueを管理し、MessageQueueからメッセージを絶えず取り出し、対応するHanlder処理にメッセージを分けます.メインスレッドでは、システムがLooperオブジェクトを初期化しているので、Handlerを直接作成することができ、Handlerを通じてメッセージを送信したり、メッセージを処理したりすることができます.プログラムは自分で起動するサブスレッドで、プログラムは自分でLooperオブジェクトを作成し、それを起動し、Looperを呼び出す必要があります.prepare()メソッド.
    prapare()メソッド:各スレッドに最大1つのLooperオブジェクトがあることを保証します.
    looper()メソッド:Looperを起動し、MessageQueueのメッセージをデッドサイクルで取り出し続け、取り出したメッセージを対応するHandlerに分けて処理します.
    MessageQueue:Looperが管理を担当し、Messageを管理するために先進的な方法を採用しています.
    Handlerの構築方法では,まず現在のスレッドに保存されているLooperインスタンスが得られ,さらにLooperインスタンスのMessageQueueに関連付けられる.HandlerのsendMessageメソッドは、msgのtargetにhandler自身に値を付け、MessageQueueに追加します.
    ソース分析転入先:http://blog.csdn.net/amazing7/article/details/51424038