首先明确一点,一个线程对应一个Looper,handler使用如下:
public class MainActivity extends AppCompatActivity {
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
};
我们在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
线程中。