細說Handler

今天來講說Android一個重要類吧:Handleride

(我寫的博客風格不適合新手,由於我討厭新手教學,我都是直奔主題,不交代來龍去脈)oop

你們都知道Handler的用法通常是線程間的通信,固然,一個線程內也能夠用Handler來通信。post

Handler發消息和回消息有三種回調方式:spa

第一種,比較少見,sendmessage線程

private Handler mHandler = new Handler(new Handler.Callback() {

        @Override
        public boolean handleMessage(Message msg) {

            return false;
        }
    });

第二種,常見的:sendmessage()以後在handleMessage裏面處理消息設計

private Handler mHandler2 = new Handler() {
        @Override
        public void handleMessage(Message msg) {
   }
}       

第三種,更常見的post,回調方法是run。。。不要看到run就認爲是在別的線程,這裏run是在主線程裏code

new Handler().post(new Runnable() {
            
            @Override
            public void run() {
                // TODO Auto-generated method stub
                
            }
        });

有興趣的能夠看看Handler的源碼,回調的時候有判斷這三種狀況,決定具體回調哪個blog

注意:Handler的默認構造方法是獲取當前線程的Looper,而默認的一個線程是不帶Looper的,須要再線程中定義Handler,就須要Looper.looper()隊列

private class Customthread implements Runnable {

        @Override
        public void run() {
            //線程中啓動Looper,開始消息循環
            Looper.prepare();
            Handler hander = new Handler() {
                public void handleMessage(Message msg) {
                    Log.i(TAG, "77777" + "當前線程爲:" + Thread.currentThread());
                }
            };
            hander.sendEmptyMessage(1);
            hander.sendEmptyMessage(1);
            Looper.loop();
        }

    }

這樣Handler纔會收到消息,看了源碼就知道,Looper.prepare()就是建立了一個Looper,而後開始循環讀取消息get

若是不想這麼麻煩怎麼辦呢,在Handler的構造方法裏面寫Looper.getMainLooper()就能夠了,這樣Handler就是用UI線程的Looper,消息的隊列是UI線程的隊列

另外再說一個類吧,HandlerThread,不想像上面這麼麻煩的話,就建一個HandlerThread類,這個線程自帶Looper和消息循環,IntentService就是這麼設計的,看看源碼就知道了 。

準備睡覺了。。。感謝各位粉絲的關注和留言,下回咱說說View的傳遞機制

相關文章
相關標籤/搜索