可以在子線程直接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】消息機制