handler

//1.初始化,參數爲名字,也就是線程的名字,後面我們會結合源碼來看
 mHandlerThread = new HandlerThread("WorkThread");
 //必須調用start方法,因爲HandlerThread繼承自Thread來啓動線程
 mHandlerThread.start();
 //初始化Handler,只是傳遞了一個mHandlerThread內部的一個looper
 mHandler = new Handler(mHandlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                Log.d("WorkThread", (Looper.getMainLooper() == Looper.myLooper()) + "," + msg.what);
            }
        };

//2.使用
  public void send(View view) {
        new SendThread(mHandler).start();
    }
    
    private final class SendThread extends Thread {
        private Handler mHandler;

        SendThread(Handler handler) {
            this.mHandler = handler;
        }

        @Override
        public void run() {
            super.run();
            for (int i = 0; i < 3; i++) {
                mHandler.sendEmptyMessage(0x1);
                SystemClock.sleep(1000);
            }
        }
    }

https://www.jianshu.com/p/c20de49d8d9a

 

總結一下:

1.首先,Looper.prepare() 在本線程中new 一個Looper實例,然會在該實例中new 一個MessageQueue對象,因爲Looper.prepare() 在一個線程中只能調用一次,所以MessageQueue 在一個線程中只會存在一個;

2.Looper.loop() 會讓當前線程進入一個無限循環,不斷從MessageQueue的實例中讀取消息,然後回調msg.target.dispatchMessage(msg)方法;

3.Handler的構造方法,會讓首先得到當前線程中保存的Looper實例,進而與Looper實例中的MessageQueue相關聯;

4.Handler的sendMessage方法,會給msg的target賦值爲handler自身,然後加入MessageQueue中;

5.在構造Handler實例時,我們會重寫handleMessage方法,也就是msg.target.dispatchMessage(msg)最終調用的方法;

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