EventBus
- Android 事件发布/订阅框架;
- 事件传递既可用于Android 四大组件间通信,也可用于线程间通信。
- 优点:代码简洁,使用简单,将事件发布 事件订阅充分解耦。
传统的事件传递 如子线程与UI线程通信:handler,广播,接口回调等。
org.greenrobot:eventbus:3.0.0
1.Handler 完成通信
Handler 负责发送消息;
Looper 负责接收 Handler 发送过来的消息 message,然后放到MessageQueue中 进行轮循。
最后Looper会把 message 返回给 Handler,调用它的handleMessage(msg) 来进行异步消息的处理。
1.1 主线程发送消息给子线程执行
private Handler handler;
class MyThread extends Thread {
@Override
public void run() {
Looper.prepare();
handler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
System.out.println("handleMessage:" + Thread.currentThread().getName());
System.out.println(msg.what + "-" + msg.obj);
}
};
Looper.loop();
super.run();
}
}
findViewById(R.id.btn_my_taxi).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message msg = handler.obtainMessage();//主线程发送消息给子线程
msg.what = 1; msg.obj = "obj msg";
handler.sendMessage(msg);
System.out.println("onclick: " + Thread.currentThread().getName());
}
});
new MyThread().start();
1.2 子线程发送消息,UI线程处理。
static Handler handler = new Handler() { //主线程定义handler
@Override
public void handleMessage(@NonNull Message msg) {
System.out.println("handleMessage:" + Thread.currentThread().getName());
System.out.println(msg.what + "-" + msg.obj);
}
};
private void initViews() {
findViewById(R.id.btn_my_taxi).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
Message msg = handler.obtainMessage();//主线程发送消息给子线程
msg.what = 1;
msg.obj = "obj msg";
handler.sendMessage(msg);
System.out.println("run: " + Thread.currentThread().getName());
}
});
thread.start(); //开启子线程
}
});
}
2.EventBus 如何简化handler通信的。 根据Event类型匹配。
implementation 'org.greenrobot:eventbus:3.0.0'
public class MyBusEvent { //1.自定义message类型
public String message;
public MyBusEvent(String message) { this.message = message;}
}
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);//3.注册
}
@Override
protected void onStop() {
super.onStop();
EventBus.getDefault().unregister(this);//3.反注册
}
//2.订阅者,一定要带上注解,表示是订阅者,表示onMessageEvent在主线程中完成
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MyBusEvent event) {
Toast.makeText(this, event.message, Toast.LENGTH_LONG).show();
}
//4.发送事件,可以在代码任意位置发送自定义类型的消息
EventBus.getDefault().post(new MyBusEvent("Msg from Moon."));
用法总结:
1.定义事件Event
2.准备订阅者 @Subscribe来表明,(threadMode = ThreadMode.MAIN)表明方法在UI线程中。
3.订阅者同时需要在总线上 注册和反注册自己。
4.发送事件