首先明確一點,一個線程對應一個Looper,handler使用如下:
public class MainActivity extends AppCompatActivity {
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
handler.jpg
我們在UI 線程構建handler
的時候并沒有指定Looper
,其實默認的是UI線程所對應的那個MainLooper
,MianLooper
和我們的handler
一一對應,實質上我們可以在UI線程中構建多個handler,但是他們共用的是同一個Looper
,也就是MainLooper
,當我們調用handler.sendMessage(msg);
的時候,首先將消息放入messageQuene
,然后mainLooper
loop到消息之后調用handlemessage
方法進行處理。
如若我們想在子線程中創建出來一個handler
來處理線程切換呢,之所以會寫這篇筆記主要是在看EventBus
源碼的時候,EventBus
會根據我們配置的線程指定方法在對應的線程中運行,EventBus
中當我們指定一個事件發生在主線程的時候,我們會判斷發送事件在某個線程,如果我們在子線程中發送到UI
線程的事件,就需要做線程切換,此時就需要在子線程中構建handler
,從而保證方法在UI
線程中執行,以下為子線程中構建handler
的代碼:
new Thread(new Runnable() {
public void run() {
Handler handler = new Handler(Looper.getMainLooper()){ // 區別在這!!!!
@Override
public void handleMessage(Message msg) {
Toast.makeText(getApplicationContext(), "handler msg", Toast.LENGTH_LONG).show();
}
};
handler.sendEmptyMessage(1);
};
}).start();
當我們再子線程中構建好handler
之后就可以指定方法放生在UI
線程中。