Android開発におけるHandlerの定番まとめ


アプリケーションが起動すると、Androidはまずメインスレッド(すなわちUIスレッド)を開き、メインスレッドは管理インタフェースのUIコントロールであり、イベント配信を行う.
一、Handlerの定義:
主にサブスレッドから送信されたデータを受け取り、このデータをメインスレッドと合わせてUIを更新します.
解釈:アプリケーションが起動すると、Androidはまずメインスレッド(つまりUIスレッド)を開きます.メインスレッドは管理インタフェースのUIコントロールであり、イベントの配布を行います.例えば、Buttonをクリックすると、AndroidはイベントをButtonに配布し、操作に応答します.  ネットワークでデータを読み込むなど、時間のかかる操作が必要な場合は、    あるいはローカルの大きなファイルを読み取るときは、これらの操作をメインスレッドに置くことはできません.メインスレッドに置くと、インタフェースに偽死現象が発生し、5秒も完成していないとAndroidシステムのエラーメッセージが表示されます.  強制的に閉じる  この場合、サブスレッドは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 
 
        } 
    } 
} 

転載先:クリックしてリンクを開く