Android之Handler使用

什麼是Handler

Handler:處理多進程之間的通信,比如,threadB需要調用ThreadA中的代碼(如一些耗時的操作,需要在新的界面進行更新),則需要通過Handler進行

handler角色的作用

在這裏插入圖片描述

Message對象放入到了消息隊列MessageQueue

調用了Hanlder的dispatchMessage方法,在該方法中我們完成對Message的處理

1.將消息加入到消息隊列中

使用handler. sendMessage將Message對象發送到消息隊列中

	msg = Message.obtain(uihandler);

    uihandler.sendMessage(msg);

使用post方法將消息對象發送到MessageQueue中

				Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable thread id " + Thread.currentThread().getId());
                        MainActivity.this.statusTextView.setText("文件下載完成");
                    }
                };
                uiHandler.post(runnable);

2.處理消息隊列中的消息

Hanlder的dispatchMessage方法,在該方法中我們完成對Message的處理

	public void dispatchMessage(Message msg) {
	    if (msg.callback != null) {
	        handleCallback(msg);
	    } else {
	        if (mCallback != null) {
	            if (mCallback.handleMessage(msg)) {
	                return;
	            }
	        }
	        handleMessage(msg);
	    }
	}
	private static void handleCallback(Message message) {
	    message.callback.run();
	}

MessageQueue

消息隊列用來存放消息的,其中有兩個重要的方法,enqueueMessage和next方法

1.enqueueMessage

將消息發送到消息隊列中,同時又兩種方法

  • sendMessage
  • post(runnable r)

以上兩種方法中,通過源碼層層調用其實際就是enqueueMessage方法

2.next

從消息隊列中取出消息

實例

流程如下

在這裏插入圖片描述

1.SendMessage方法發送消息

通過此方法發送消息,需要重寫handlMessage方法,如下:

   private Handler uihandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            //如果使用的是
            Log.i(TAG,"msg.what= "+msg.what);
            switch (msg.what){
                case 1:
                    System.out.println("handleMessage thread id " + Thread.currentThread().getId());
                    System.out.println("msg.arg1:" + msg.arg1);
                    System.out.println("msg.arg2:" + msg.arg2);
                    MainActivity.this.statusTextView.setText("文件下載完成");
                    Log.i(TAG,"##文件下載完成,更新UI ");
                    break;
            }

            System.out.println("handleMessage thread id " + Thread.currentThread().getId());
            MainActivity.this.statusTextView.setText("文件下載完成");

            Log.i(TAG,"文件下載完成,更新UI ");
        }
    };

1.1 通過使用obtainMessage方法實例化msg

	Message msg = new Message();//msg對象表示線程要處理的事情

    //方式一:使用obtainMessage方法實例化msg,handleMessage中使用msg.what進行匹配
    msg = uihandler.obtainMessage();
    msg.what = 1;
    msg.arg1 = 123456;
    msg.arg2 = 654321;

	uihandler.sendMessage(msg);

1.2 通過obtain方法實例化msg

msg = Message.obtain(uihandler);
uihandler.sendMessage(msg);
Log.i(TAG,"sendMessage ");

2.post方法發送消息

private Handler uiHandler = new Handler();

2.1 實現Runable接口

Runnable runnable = new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Runnable thread id " + Thread.currentThread().getId());
                        MainActivity.this.statusTextView.setText("文件下載完成");
                    }
                };
                uiHandler.post(runnable);//將Runnable對象通過post方法發送到Handler關聯的消息隊列中,Handler會在合適的時候將讓主線程執行Runnable中的代碼,從而更新ui

項目代碼

項目代碼https://github.com/409144245/HandlerTest

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章