AndroidでのHandlerまとめ転載

3972 ワード

一、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の例
(1)サブクラスは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

        }
    }

}