目录
EventBus,顾名思义即事件总线,是针对Android跨进程、线程通信的优化方案,在一定程度上可以代替Handle、Intent、Brodcast等实现通信;如下图所示即EventBus的运行框架。
在EventBus中主要有以下三个成员:
1. build.gradle 中添加EventBus的依赖:
dependencies {
...
compile 'org.greenrobot:eventbus:3.1.1'
}
2. 定义Event事件类:
public class myEvent {
private String mMessage;
...
}
3. 添加订阅事件:
EventBus.getDefault().register(this);
4. 定义事件处理方法并添加注解,参数为定义的事件类:
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEvent(myEvent me){
...
}
5. 发布事件以触发事件处理方法:
EventBus.getDefault().post(new myEvent("this is first message !"));
以下Demo以5中不同的ThreadMode定义了5个事件处理方法,并新开启一个线程作为事件发布者。
/**
* Created by wise on 2018/5/16.
*/
/**Event事件类**/
public class myEvent {
private String mMessage;
public myEvent(String message){
this.mMessage = message;
}
public void setMessage(String message){
this.mMessage = message;
}
public String getmessage(){
return this.mMessage;
}
}
public class EventBusActivity extends AppCompatActivity {
private static final String TAG = "EventBusActivity";
private TextView tv_Event;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_event_bus);
/**注册事件**/
EventBus.getDefault().register(this);
Thread thread1 = new Thread(new myThread1());
thread1.start();
}
/**事件处理方法**/
@Subscribe(threadMode = ThreadMode.MAIN)
public void onEventMain(myEvent me){
Log.d(TAG,me.getmessage() + " onEventMain" + " thread:" + android.os.Process.myTid());
}
/**事件处理方法**/
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onEventMainOrdered(myEvent me){
Log.d(TAG,me.getmessage() + " onEventMainOrdered" + " thread:" + android.os.Process.myTid());
}
/**事件处理方法**/
@Subscribe(threadMode = ThreadMode.POSTING)
public void onEventPosting(myEvent te){
Log.d(TAG,te.getmessage() + " onEventPosting" + " thread:" + android.os.Process.myTid());
}
/**事件处理方法**/
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onEventBackground(myEvent me){
Log.d(TAG,me.getmessage() + " onEventBackground" + " thread:" + android.os.Process.myTid());
}
/**事件处理方法**/
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onEventAsync(myEvent me){
Log.d(TAG,me.getmessage() + " onEventAsync" + " thread:" + android.os.Process.myTid());
}
@Override
protected void onDestroy() {
super.onDestroy();
/**解注册**/
EventBus.getDefault().unregister(this);
}
public class myThread1 implements Runnable {
@Override
public void run() {
Log.d(TAG,"" + android.os.Process.myTid());
try {
Thread.sleep(1000);
/**事件发布**/
EventBus.getDefault().post(new myEvent("this is first message !"));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
执行结果如下:
05-24 17:17:47.335 24447 24478 D EventBusActivity: 24478
05-24 17:17:48.341 24447 24478 D EventBusActivity: this is first message ! onEventBackground thread:24478
05-24 17:17:48.341 24447 24498 D EventBusActivity: this is first message ! onEventAsync thread:24498
05-24 17:17:48.342 24447 24447 D EventBusActivity: this is first message ! onEventMain thread:24447
05-24 17:17:48.342 24447 24447 D EventBusActivity: this is first message ! onEventMainOrdered thread:24447
05-24 17:17:48.344 24447 24478 D EventBusActivity: this is first message ! onEventPosting thread:24478
主线程Tid为24447,子线程Tid为24478,可以看到每种ThreadMode的运行方式。另外我们可以通过定义不同的事件类作为post的参数来执行不同的事件执行方法,后一篇会分析源码解释调用事件处理方法的逻辑。
以上的Demo中,事件订阅者的注册必须在发布事件之前,否则发布之后,订阅者无法接受到事件,而粘性事件则避免了这一问题,粘性事件的发布使用postSticky()方法即可,并在注解中配置sticky参数。
// 订阅粘性事件
@Subscribe(sticky = true)
public void onMessageEvent(myEvent me) {
...
}
// 粘性事件发布
EventBus.getDefault().postSticky(new myEvent ("This is sticky event"));
发布一个粘性事件之后,EventBus将在内存中缓存该粘性事件。当有订阅者订阅了该粘性事件,订阅者将接收到该事件。需要注意的是在未移除粘性事件之前,它会一直缓存在内存中,因此在处理完该事件后要及时移除该事件的缓存,移除粘性事件的方法如下:
// 移除指定的粘性事件
removeStickyEvent(Object event);
// 移除指定类型的粘性事件
removeStickyEvent(Class eventType);
// 移除所有的粘性事件
removeAllStickyEvents();
在定义事件处理方法时,还可以在注解中设置该方法的优先级:
@Subscribe(priority = 1)
public void onEvent(myEvent me) {
...
}
默认情况下,订阅者方法的事件传递优先级为0。数值越大,优先级越高。在相同的线程模式下,更高优先级的订阅者方法将优先接收到事件。注意:优先级只有在相同的线程模式下才有效。