【面試】可以在子線程直接new一個Handler嗎?怎麼做?

可以在子線程直接new一個Handler,不過需要在子線程裏先調用Looper.prepare(),new一個Handler後,還需要調用Looper.loop()方法。

      new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        super.handleMessage(msg);
                    }
                };
                Looper.loop();
            }
        })

有人會問,在主線程中爲什麼沒看到Looper.prepare()?其實系統已經給我們調用了,不過調用的是Looper.prepareMainLooper(),如下源碼所示:
android-28的SystemServer類中:

    /**
     * The main entry point from zygote.
     */
    public static void main(String[] args) {
        new SystemServer().run();
    }


    private void run() {
        ......
        Looper.prepareMainLooper();
        ......
    }

main方法是整個android應用的入口,在子線程中調用Looper.prepare()是爲了創建一個Looper對象,並將該對象存儲在當前線程的ThreadLocal中,每個線程都會有一個ThreadLocal,它爲每個線程提供了一個本地的副本變量機制,實現了和其它線程隔離,並且這種變量只在本線程的生命週期內起作用,可以減少同一個線程內多個方法之間的公共變量傳遞的複雜度。Looper.loop()方法是爲了取出消息隊列中的消息並將消息發送給指定的handler,通過msg.target.dispatchMassage()方法。具體可參考:
【Android】消息機制

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