EventBus示例:
之前做图片社交App的时候,需要处理一个点赞数据的同步,比如在作品的详情页点赞 需要同时更新列表页该作品的点赞数量,这里还是以此为例。
1.)build.gradle添加引用
1 |
compile 'org.greenrobot:eventbus:3.0.0' |
2.)定义一个事件类型
1 2 3 4 5 6 7 8 9 10 11 |
public class DataSynEvent { private int count; public int getCount() { return count; } public void setCount(int count) { this.count = count; } } |
3.)订阅/解除订阅
订阅
1 |
EventBus.getDefault().register(this);//订阅 |
解除订阅
1 |
EventBus.getDefault().unregister(this);//解除订阅 |
4.)发布事件
1 |
EventBus.getDefault().post(new DataSynEvent()); |
5.)订阅事件处理
1 2 3 4 |
@Subscribe(threadMode = ThreadMode.MAIN) //在ui线程执行 public void onDataSynEvent(DataSynEvent event) { Log.e(TAG, "event---->" + event.getCount()); } |
ThreadMode总共四个:
- NAIN UI主线程
- BACKGROUND 后台线程
- POSTING 和发布者处在同一个线程
- ASYNC 异步线程
6.)订阅事件的优先级
事件的优先级类似广播的优先级,优先级越高优先获得消息
1 2 3 4 |
@Subscribe(threadMode = ThreadMode.MAIN,priority = 100) //在ui线程执行 优先级100 public void onDataSynEvent(DataSynEvent event) { Log.e(TAG, "event---->" + event.getCount()); } |
7.)终止事件往下传递
发送有序广播可以终止广播的继续往下传递,EventBus也实现了此功能
1 |
EventBus.getDefault().cancelEventDelivery(event) ;//优先级高的订阅者可以终止事件往下传递 |
8.)处理代码混淆
1 2 3 4 5 6 7 8 9 10 |
-keepattributes *Annotation* -keepclassmembers class ** { @org.greenrobot.eventbus.Subscribe <methods>; } -keep enum org.greenrobot.eventbus.ThreadMode { *; } # Only required if you use AsyncExecutor -keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent { <init>(java.lang.Throwable); } |
Comments | NOTHING