Handlerの使用解析

6653 ワード

HandlerにはPostとsendMessageの2つの使い方があります.
义齿
  • post(Runnable r):一般的なpost方式.
  • postAtTime(Runnable r,long uptimeMillis):ある絶対時間に
  • を実行するように設定
  • postAtTime(Runnable r, Object token, long uptimeMillis)
  • postDelayed(Runnable r,long delayMillis):実行遅延時間を設定して
  • を実行
    Handlerを決める
    private Handler mPostHandler = new Handler();
    

    サブスレッドを作成:
    private class TestThread extends Thread{
        @Override
        public void run() {
    
            try {
                Thread.sleep(5000);
    
    
                /**
                 * Post     Runnable          .
                 *    :
                 * post(Runnable)
                 * postAtTime(Runnable,long)
                 * postDelayed(Runnable,long)
                 *
                 *   Handler Post    ,      Runnable        ,   Runnable   ,  run()  。     run()        UI      。
                 */
                mPostHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        text.setText("Handler Post      ");
                        LogHelper.i("Handler Post      ");
                    }
                });
    
                /**
                 * postAtTime:              。
                 */
                mPostHandler.postAtTime(new Runnable() {
                    @Override
                    public void run() {
                        text.setText(text.getText().toString()+"
    Handler postAtTime "); LogHelper.i("Handler postAtTime "); } }, SystemClock.uptimeMillis() + 5000); /** * postDelayed: . */ mPostHandler.postDelayed(new Runnable() { @Override public void run() { text.setText(text.getText().toString()+"
    Handler postDelayed "); LogHelper.i("Handler postDelayed "); } },1000); } catch (InterruptedException e) { e.printStackTrace(); } } }

    sendMessage方式
    まずHandlerでMessageを処理します.
  • sendMessage(Message msg):
  • sendMessageDelayed(Message msg, long delayMillis):
  • sendMessageAtTime(Message msg, long uptimeMillis) :
  • sendEmptyMessage(int what)
  • sendEmptyMessageDelayed(int what, long delayMillis)
  • sendEmptyMessageAtTime(int what, long uptimeMillis) : private Handler mHandler = new Handler(){
      @Override
      public void handleMessage(Message msg) {
          switch (msg.what){
              case MSG_ONE:
                  String obj = (String)msg.obj;
                  LogHelper.i("
    obj is : " + obj); text.setText(text.getText().toString()+"obj is : " + obj); int arg1 = msg.arg1; int arg2 = msg.arg2; LogHelper.i("
    arg1 is : " + arg1 + " arg2 is : " + arg2); text.setText(text.getText().toString()+"arg1 is : " + arg1 + " arg2 is : " + arg2); if(msg.getData() != null){ String test = (String)msg.getData().get("test"); LogHelper.i("
    test is : " + test); text.setText(text.getText().toString()+"test is : " + test); } break; case MSG_TWO: LogHelper.i("receive MSG_TWO "); break; } }
    };

  • サブスレッドの作成
    private class TestMessageThread extends Thread {
        @Override
        public void run() {
    
            try {
                Thread.sleep(5000);
    
                /**
                 *  3     Message:
                 *
                 * 1、Message message = new Message();
                 * 2、Message message = Message.obtain();
                 * 3、Message message = mHandler.obtainMessage();
                 *
                 */
                Message message = Message.obtain();
    
                /**
                 * what         Message    ,    Handler handleMessage     what      Message,             
                 */
                message.what = MSG_ONE;
    
                /**
                 *     arg1 arg2 Message       
                 */
                message.arg1 = 100;
                message.arg2 = 101;
    
                /**
                 *      obj  Object     Message      
                 */
                message.obj = new String("Obj String");
    
                /**
                 *   setData   getData   Message      Bundle     
                 */
                Bundle bundle = new Bundle();
                bundle.putString("test","test string");
                message.setData(bundle);
    
                mCallHandler.sendMessage(message);
                /**
                 *      。
                 */
                mCallHandler.sendEmptyMessage(MSG_TWO);
    
                /**
                 *              。
                 */
                mHandler.sendMessageAtTime(message,SystemClock.uptimeMillis() + 5000);
    
                /**
                 *     
                 */
                mHandler.sendMessageDelayed(message,1000);
    
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    HandlerにはCallback付きの構造関数もあります.
    /**
     * Callback         true,      ,      false,         handleMessage,       .
     */
    private Handler mCallHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if(msg.what == MSG_TWO){
                LogHelper.i("Callback  MSG_TWO ");
                return true;
            }
            return false;
        }
    }){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case MSG_ONE:
                    String obj = (String)msg.obj;
                    LogHelper.i("
    obj is : " + obj); text.setText(text.getText().toString()+"obj is : " + obj); int arg1 = msg.arg1; int arg2 = msg.arg2; LogHelper.i("
    arg1 is : " + arg1 + " arg2 is : " + arg2); text.setText(text.getText().toString()+"arg1 is : " + arg1 + " arg2 is : " + arg2); if(msg.getData() != null){ String test = (String)msg.getData().get("test"); LogHelper.i("
    test is : " + test); text.setText(text.getText().toString()+"test is : " + test); } break; case MSG_TWO: LogHelper.i("receive MSG_TWO "); break; } } };