第三方通信 ——— EventBus,rxBus
3. 第三方通信
EventBus主要角色:
Event 传递的事件对象
Subscriber 事件的订阅者
Publisher 事件的发布者
ThreadMode 定义函数在何种线程中执行
定义一个事件类型
1 2 3 4 5 6 7 8 9 10 11
| public class DataEvent { private int count;
public int getCount() { return count; }
public void setCount(int count) { this.count = count; } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| //订阅
EventBus.getDefault().register(this);//订阅
//解除订阅
EventBus.getDefault().unregister(this);//解除订阅
//发布事件
EventBus.getDefault().post(new DataEvent());
//订阅事件处理
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行 public void onDataEvent(DataEvent event) { Log.e(TAG, "event---->" + event.getCount()); }
|
ThreadMode总共四个:
1 2 3 4
| NAIN UI主线程 BACKGROUND 后台线程 POSTING 和发布者处在同一个线程 ASYNC 异步线程
|
事件的优先级类似广播的优先级,优先级越高优先获得消息
1 2 3 4
| @Subscribe(threadMode = ThreadMode.MAIN,priority = 100) //在ui线程执行 优先级100 public void onDataEvent(DataEvent event) { Log.e(TAG, "event---->" + event.getCount()); }
|
终止事件往下传递
发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能
1
| EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递
|
EventBus黏性事件
何为黏性事件呢?简单讲,就是在发送事件之后再订阅该事件也能收到该事件,跟黏性广播类似。
本身粘性广播用的就比较少,为了方便理解成订阅在发布事件之后,但同样可以收到事件。订阅/解除订阅和普通事件一样,但是处理订阅函数有所不同,需要注解中添加sticky = true
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| @Subscribe(threadMode = ThreadMode.MAIN,sticky = true) //在ui线程执行 public void onDataEvent(DataEvent event) { Log.e(TAG, "event---->" + event.getCount()); }
//发送粘性事件
EventBus.getDefault().postSticky(new DataEvent());
//对于粘性广播我们都比较清楚属于常驻广播,对于EventBus粘性事件也类似,我们如果不再需要该粘性事件我们可以移除
EventBus.getDefault().removeStickyEvent(new DataEvent());
//或者调用移除所有粘性事件
EventBus.getDefault().removeAllStickyEvents();
|
RXBus:如果项目中用了rxjava的话可以参考https://github.com/AndroidKnife/RxBus 自己封装一个。
下一章长链接推送