在子線程中new一個Handler

handler的作用是線程間通信
那麼在子線程中new一個handler就是要有其他線程想要和他通信

如果直接new

Thread thread=new Thread(){
            @Override
            public void run() {
                super.run();

                handler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Log.i(TAG, "handleMessage: "+msg.toString());
                    }

                    @Override
                    public void dispatchMessage(Message msg) {
                        super.dispatchMessage(msg);
                        Log.i(TAG, "dispatchMessage: "+msg.toString());
                    }
                };


            }
        };
              thread.start();

報錯如下

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

也就是沒有looper
所以要加上Looper.prepare(); Looper.loop();

thread= new Thread(){
            @Override
            public void run() {
                super.run();
                Looper.prepare();

                handler=new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                        Log.i(TAG, "handleMessage: "+msg.toString());
                    }

                    @Override
                    public void dispatchMessage(Message msg) {
                        super.dispatchMessage(msg);
                        Log.i(TAG, "dispatchMessage: "+msg.toString());
                    }
                };
                Looper.loop();


            }
        };
              thread.start();

        //Looper.
    }

這樣主線程,其他線程才能和他通信

既然有啓動looper,必然有退出looper
那麼怎麼停止我這個線程中的looper呢
調用quit();
注意api版本quitSafely低版本沒有

  handler.getLooper().quit();
   handler.getLooper().quitSafely()

quit和quitSafely區別
當我們調用Looper的quit方法時,實際上執行了MessageQueue中的removeAllMessagesLocked方法,該方法的作用是把MessageQueue消息池中所有的消息全部清空,無論是延遲消息(延遲消息是指通過sendMessageDelayed或通過postDelayed等方法發送的需要延遲執行的消息)還是非延遲消息。

當我們調用Looper的quitSafely方法時,實際上執行了MessageQueue中的removeAllFutureMessagesLocked方法,通過名字就可以看出,該方法只會清空MessageQueue消息池中所有的延遲消息,並將消息池中所有的非延遲消息派發出去讓Handler去處理,quitSafely相比於quit方法安全之處在於清空消息之前會派發所有的非延遲消息。

無論是調用了quit方法還是quitSafely方法只會,Looper就不再接收新的消息。即在調用了Looper的quit或quitSafely方法之後,消息循環就終結了,這時候再通過Handler調用sendMessage或post等方法發送消息時均返回false,表示消息沒有成功放入消息隊列MessageQueue中,因爲消息隊列已經退出了。

需要注意的是Looper的quit方法從API Level 1就存在了,但是Looper的quitSafely方法從API Level 18才添加進來。

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