AndroidでのHandlerの使用


Androidアプリケーションが起動すると、Androidはまずメインスレッド、すなわちUIスレッドを開き、メインスレッドは管理インタフェースのUIコントロールであり、イベント配信を行う.Handlerの定義:主にサブスレッドから送信されたデータを受け取り、このデータをメインスレッドと合わせてUIを更新する.解釈:アプリケーションが起動すると、Androidはまずメインスレッド(つまりUIスレッド)を開きます.メインスレッドは管理インタフェースのUIコントロールであり、イベントの配布を行います.例えば、Buttonをクリックすると、AndroidはイベントをButtonに配布し、操作に応答します.ネットワークでデータを読み取る、ローカルの大きなファイルを読み取るなど、時間のかかる操作が必要な場合は、これらの操作をメインスレッドに置くことはできません.メインスレッドに置くと、インタフェースに偽死現象が発生します.5秒も完成していない場合は、Androidシステムのエラーメッセージ「強制シャットダウン」(ANR異常)が表示されます.この場合、サブスレッドはUI更新に関連するため、Androidプライマリスレッドはスレッドが安全ではありません.つまり、UIの更新はプライマリスレッドでしか更新できません.サブスレッドでの操作は危険です.この時、Handlerが現れました.、この複雑な問題を解決するために、Handlerはメインスレッド(UIスレッド)で実行されるため、サブスレッドとMessageオブジェクトを介してデータを伝達することができ、このときHandlerはサブスレッドからの(サブスレッドはsedMessage()メソッドで弟を伝達する)Messageオブジェクトを受け入れ、これらのメッセージをメインスレッドキューに入れ、メインスレッドに合わせてUIを更新します.
二、Handlerのいくつかの特徴
handlerはMessageオブジェクトとRunnableオブジェクトをプライマリ・スレッドに配布できます.各Handlerインスタンスは、作成したスレッド(通常はプライマリ・スレッド)にバインドされます.これには2つの役割があります.
(1)メッセージまたはRunnableをあるメインスレッドのある場所で実行するように手配する.
(2)動作を異なるスレッドで実行するように手配する.Handlerでメッセージを配信する方法
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上のpostクラスメソッドでは、Runnableオブジェクトをプライマリ・スレッド・キューに配置できます.
sendMessageクラスメソッドでは、データ付きMessageオブジェクトをキューに配置し、更新を待つことができます.三、Handlerの例
サブクラスは、Hendlerクラスを継承し、スレッドデータを受け入れるためにhandleMessage(Message msg)メソッドを書き換える必要があります.
スレッドによってインタフェースButtonの内容を変更する機能を実装する例を次に示します.
    public class MyHandlerActivity extends Activity { 
        Button button; 
        MyHandler myHandler; 

        protected void onCreate(Bundle savedInstanceState) { 
            super。onCreate(savedInstanceState); 
            setContentView(R。layout。handlertest); 

            button = (Button) findViewById(R。id。button); 
            myHandler = new MyHandler(); 
            //        Handler   ,                 ,       
            // Handler     , (1) :     Message Runnalbe    
            // (2):      ,         。 

            //      ,      
            // post(Runnable) 
            // postAtTime(Runnable,long) 
            // postDelayed(Runnable,long) 
            // sendEmptyMessage(int) 
            // sendMessage(Message); 
            // sendMessageAtTime(Message,long) 
            // sendMessageDelayed(Message,long) 

            //       post        Runnable   
            //sendMessage()     Message  (Message       ,) 

            MyThread m = new MyThread(); 
            new Thread(m)。start(); 
        } 

        /** *     ,     , Handler            * */ 

        class MyHandler extends Handler { 
            public MyHandler() { 
            } 

            public MyHandler(Looper L) { 
                super(L); 
            } 

            //          ,     
            @Override 
            public void handleMessage(Message msg) { 
                // TODO Auto-generated method stub 
                Log。d("MyHandler""handleMessage。。。。。。"); 
                super。handleMessage(msg); 
                //       UI 
                Bundle b = msg。getData(); 
                String color = b。getString("color"); 
                MyHandlerActivity。this。button。append(color); 

            } 
        } 

        class MyThread implements Runnable { 
            public void run() { 

                try { 
                    Thread。sleep(10000); 
                } catch (InterruptedException e) { 
                    // TODO Auto-generated catch block 
                    e。printStackTrace(); 
                } 

                Log。d("thread。。。。。。。""mThread。。。。。。。。"); 
                Message msg = new Message(); 
                Bundle b = new Bundle();//      
                b。putString("color""  "); 
                msg。setData(b); 

                MyHandlerActivity。this。myHandler。sendMessage(msg); //  Handler    ,  UI 

            } 
        } 
    } 

Androidのアプリケーションはメッセージによって駆動され、システムは各アプリケーションのためにメッセージキュー(MwssageQueue)を維持し、アプリケーションのメインスレッド(UI)は絶えずこのメッセージキューからメッセージ(Looper)を取得し、メッセージを処理する(Handler)ので、ここには3つの重要な役割があります.
1:MessageQueue:メッセージを格納するメッセージキュー2:Looper:メッセージキューからメッセージを順番に取り出し、ブランチ3:Looper:メッセージの送信と処理