首先明确一点,一个线程对应一个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 线程中。










网友评论