前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android十八章:EventBus3.0使用

Android十八章:EventBus3.0使用

作者头像
ppjun
发布2018-09-05 11:52:31
5040
发布2018-09-05 11:52:31
举报
文章被收录于专栏:ppjun专栏ppjun专栏

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

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

如何使用EventBus

在app/build.gradle

代码语言:javascript
复制
compile 'org.greenrobot:eventbus:3.0.0'

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

代码语言:javascript
复制
protected void onCreate(Bundle savedInstanceState){
  EventBus.getDefault().register(MainActivity.this);//注册
}
代码语言:javascript
复制
protected void onDestory(){
  EventBus.getDefault().unregister(MainActivity.this);//取消注册

}

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

代码语言:javascript
复制
@Subscribe
public void getMessage(String msg){
    Log.i(TAG,msg);
}
  • 如果有方法注解了@Subscribe,而没先注册就会在日志打印
代码语言:javascript
复制
 No subscribers registered for event class com.ppjun.demo.MessageEvent
 No subscribers registered for event class org.greenrobot.eventbus.NoSubscriberEvent
  • 如果actiivty注册了eventbus,而没写一个方法被@Subscribe注解就会报异常
代码语言:javascript
复制
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。

代码语言:javascript
复制
Aactivity.java
protected void onCreate(Bundle savedInstanceState){
  EventBus.getDefault().postSticky("msg from A");
  startActivity(new Intent(Aactivity.this,Bactivity.class));

}

Bactivity.java
protected 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,优先级更高的会被先执行。

代码语言:javascript
复制
@Subscribe(priority=1)
public void getMessage(String a){

}

取消订阅者Subscriber

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

代码语言:javascript
复制
@Subscribe
public void onEvent(String msg){
  EventBus.getDefault().cancelEventDelivery(msg);
}

EventBus的混肴

代码语言:javascript
复制
-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);
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.03.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何使用EventBus
  • post和postSticky的区别
  • Subscribers的优先级
  • 取消订阅者Subscriber
  • EventBus的混肴
相关产品与服务
事件总线
腾讯云事件总线(EventBridge)是一款安全,稳定,高效的云上事件连接器,作为流数据和事件的自动收集、处理、分发管道,通过可视化的配置,实现事件源(例如:Kafka,审计,数据库等)和目标对象(例如:CLS,SCF等)的快速连接,当前 EventBridge 已接入 100+ 云上服务,助力分布式事件驱动架构的快速构建。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档