new Handler().postDelayed(new Runnable())是否執行在主執行緒?

童思宇發表於2018-04-12

問題:new Handler().postDelayed(new Runnable())是否執行在主執行緒?

答案:是的.

這個 new Runnable() 依附於建立Handler的執行緒,如下程式碼,在絕對的UI執行緒中列印執行緒Id:

System.out.print("UI Thread == " + Thread.currentThread().getId());

然後在postDelayed中列印執行執行緒的Id:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        System.out.print("Handler Thread == " + Thread.currentThread().getId());
    }
}, 1000);

最後列印結果如下:

04-12 09:52:24.110 17026-17026/com.spd.sinoss I/System.out: UI Thread = 1  
04-12 09:52:27.111 17026-17026/com.spd.sinoss I/System.out: Handler Thread = 1

因此,可以看出來,它們兩個程式都是執行在主執行緒中的。

官方解釋是:

The runnable will be run on the thread to which this handler is attached.

因為,這個開啟的Runnable()介面會在這個Handler所依附執行緒中執行,而這個Handler是在UI執行緒中建立的,所以 

自然地依附在主執行緒中了,且new Handler().postDelayed(new Runnable())沒有重新生成新的 New Thread().

相關文章