EventBus是一个在Android优化很好的事件总线,他简化Android的activity,fragment,thread,Service之间通信,代码体积小,质量更高。

总之,他可以代替handler发送msg和Message接受msg,还可以代替intent在activity,fragment等传递msg。

如何使用EventBus

在app/build.gradle

compile 'org.greenrobot:eventbus:3.0.0'

然后在onCreate()注册eventbus,在onDestroy()取消注册。

protected void onCreate(Bundle savedInstanceState){  EventBus.getDefault().register(MainActivity.this);//注册}
protected void onDestory(){  EventBus.getDefault().unregister(MainActivity.this);//取消注册}

同时在注册的界面接受msg,这里的方法名可以自定义,只要方法前有@Subscribe的注解。

@Subscribepublic void getMessage(String msg){    Log.i(TAG,msg);}
  • 如果有方法注解了@Subscribe,而没先注册就会在日志打印
 No subscribers registered for event class com.ppjun.demo.MessageEvent No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent
  • 如果actiivty注册了eventbus,而没写一个方法被@Subscribe注解就会报异常
Subscriber class com.ppjun.amapmaster.BActivity and its super classes have no public methods with the @Subscribe annotation

其中@Subscribe注解可以有以下几种情况:

  • @Subscribe(sticky = true)

代表在activity用postSticky信息之后再注册evnetbus,要用这种sticky=true注解方法来接受msg,因为sticky默认为false的

  • @Subscribe(threadMode = ThreadMode.MAIN)

代表主线程或者子线程post信息的到activity的主线程。

  • @Subscribe(threadMode = ThreadMode.BACKGROUND)

如果发布线程是主线程,eventbus就会用一个后台子线程发送给主线程,如果发布线程是子线程,那么处理方法就在子线程执行。最后经过或者不经过线程切换都会原来的线程。

  • @Subscribe(threadMode = ThreadMode.POSTING)

不需要切换线程,发布线程和处理线程一样。简单来说在什么线程post就在什么线程处理。

  • @Subscribe(threadMode = ThreadMode.ASYNC)

处理方法在主线程和发布线程意外的线程执行,处理一些耗时的操作如网络请求。如果有必要还会开启线程池。

post和postSticky的区别

一般注册后,再post信息要用post,而在没注册前post信息,这时候还没有Subscriber,就要用postSticky。

Aactivity.javaprotected void onCreate(Bundle savedInstanceState){  EventBus.getDefault().postSticky("msg from A");  startActivity(new Intent(Aactivity.this,Bactivity.class));}Bactivity.javaprotected void onCreate(Bundle savedInstanceState){  EventBus.getDefault().register(this);}@Subscribe(sticky = true)   public void getMessage(String msg){     Log.i(TAG,msg);//这里打印出 msg from A}protected void onDestory(){  EventBus.getDefault.unregister(this);}

Subscribers的优先级

要在同一中ThreadMode中 ,默认的priority是0,优先级更高的会被先执行。

@Subscribe(priority=1)public void getMessage(String a){}

取消订阅者Subscriber

通常由优先级更高的订阅者来取消低优先级的订阅者。

@Subscribepublic void onEvent(String msg){  EventBus.getDefault().cancelEventDelivery(msg);}

EventBus的混肴

-keepattributes *Annotation*-keepclassmembers class ** {    @org.greenrobot.eventbus.Subscribe ;}-keep enum org.greenrobot.eventbus.ThreadMode { *; }# Only required if you use AsyncExecutor-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {    (java.lang.Throwable);}

更多相关文章

  1. Android(安卓)ConditionVariable的用法
  2. android TIF启动流程
  3. volume 服务
  4. Android之Looper、Handler、Message、MessageQueue应用篇
  5. handler异步处理
  6. 【Android】Back Home键监听
  7. Android(安卓)EventBus学习
  8. Android中AsyncTask的源码分析以及实例
  9. Android(安卓)学习笔记 BroadcastReceiver广播...

随机推荐

  1. Android中子布局填充ScrollView
  2. Android中webview跟JAVASCRIPT中的交互
  3. Android编译系统学习总结
  4. Android获取经纬度
  5. android振动效果的实现
  6. 【android】以前没有注意的一个ListActiv
  7. (转帖)Android系列之Wifi定位
  8. Android处理后台返回数据——Json转实体
  9. Android(安卓)Studio中同步代码时报:Recei
  10. android sqlite