Android使用EventBus遇到的坑!

EventBus是一款针对Android优化的发布/订阅事件总线(内部是观察者设计模式)。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
来个清晰明了的图片:

这里写图片描述

Event:事件(订阅者根据事件来判断是否接收事件)
Subscriber:事件订阅者,接收特定的事件。
Publisher:事件发布者,用于通知Subscriber有事件发生。
其中,Event可以使任意类型对象。Subscriber都是以约定的onEvent开头的函数,具体是onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync这四个。Publisher可以通过post(Object)在任意线程任意位置发送事件。

混淆文件配置

-keepattributes *Annotation*//keep反射
-keepclassmembers class * {
    @org.greenrobot.eventbus.Subscribe ;//这个牵涉到你的需求如何,如果你使用了EventBus processor进行加速,你就必须加上这个,只要有这个注解的类和方法都不混淆,为反编译提供了便利。。。如果没有用到加速,这个就不用了
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor//如果你使用了ASYNC 异步线程
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    (java.lang.Throwable);
}
-keep class de.greenrobot.event.** {*;}
-keepclassmembers class ** {
    public void onEvent*(**);
    void onEvent*(**);
}
-keepclassmembers class * {@com.xxx.Subscribe ;}
-keepclassmembers class * {@com.xxx.Action ;}

经常会出现的问题

1、若使用EventBus时出现异常:Subscriber class *** and its super classes have no public methods with the @Subscribe annotation
报错的原因:使用EventBus的方法不是public,且缺少@Subscribe这个注解。
按照提示改为public,并且加上@Subscribe这个注解就Ok了。

这里写图片描述

2、若收不到事件,比如在Activity的oncreat中发送事件,在Fragment中的oncreat中接收事件,可能是因为发送事件时Fragment还未注册EventBus。

3、发送事件的类是不需要注册的,只有接收事件的类需要注册;注意要记得在合适时机取消注册。

EventBus升级3.0以后事件的订阅已经从方法名换成了注解的方式,而且整体还是有不少变化。但使用原理之类的没有变

EventBus包含4个ThreadMode:PostThread,MainThread,BackgroundThread,Async
方法名为:onEventPostThread, onEventMainThread,onEventBackgroundThread,onEventAsync即可
onEventMainThread代表这个方法会在UI线程执行
onEventPostThread代表这个方法会在当前发布事件的线程执行
BackgroundThread这个方法,如果在非UI线程发布的事件,则直接执行,和发布在同一个线程中。如果在UI线程发布的事件,则加入后台任务队列,使用线程池一个接一个调用
Async 加入后台任务队列,使用线程池调用,注意没有BackgroundThread中的一个接一个

EventBus在一个页面中注册EventBus.getDefault().register(this);,
在onDestory()中取消注册 EventBus.getDefault().unregister(this);
在其他页面post(同一个页面也可以),EventBus.getDefault().post(object)),object是自定义的对象。;
在注册页面中重写onEvent**(object)接收消息。
EventBus内部是通过观察者模式实现告知观察者事件发生时通过EventBus.post函数实现,这个过程叫做事件的发布,观察者被告知事件发生叫做事件的接收,是通过下面的订阅函数实现的。
消息的接收是根据参数中的哦object类名来决定执行哪一个的;!!!

你可能感兴趣的:(android)