EventBus3.0简析

来源:互联网 发布:sqlserver存储过程更新 编辑:程序博客网 时间:2024/06/11 13:22

EventBus3.0


什么是EventBus

  EventBus是一个Android端优化的publish/subscribe消息总线,简化了应用程序内各组件间、组件与后台线程间的通信。比如请求网络,等网络返回时通过Handler或Broadcast通知UI,两个Fragment之间需要通过Listener通信,这些需求都可以通过EventBus实现。


EventBus框架

  大家谈到EventBus,总会想到greenrobot的EventBus,但是实际上EventBus是一个通用的叫法,例如Google出品的Guava,Guava是一个庞大的库,EventBus只是它附带的一个小功能,因此实际项目中使用并不多。用的最多的是greenrobot/EventBus,这个库的优点是接口简洁,集成方便,但是限定了方法名,不支持注解。另一个库square/otto修改自 Guava ,用的人也不少。

这篇博文暂时只讨论greenrobot的EventBus库。

基本用法

添加依赖库:
首先你要为你的app添加依赖库:

compile 'de.greenrobot:eventbus:3.0.0-beta1'

注册和反注册

protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    EventBus.getDefault().register(this);}@Overrideprotected void onDestroy() {    super.onDestroy();    EventBus.getDefault().unregister(this);}

发布者

  String str = “hello World!”  EventBus.getDefault().post(str);

接收者

不同于2.4版本的四个方法,3.0版本使用注解完成事件接收。

@Subscribe(threadMode = ThreadMode.MainThread,priority = 100)        //在ui线程执行,优先级为100  public void helloEventBus(String message){        //接收消息,处理消息        String str = message;    }

5.优先级高的可以拦截事件向下传递

 EventBus.getDefault().cancelEventDelivery(event) ;

原理初探

  你订阅了内容,所以你需要在该类注册EventBus,而你订阅的方法需要传入String,即你的接收信息为String类型,那么在post的时候,你post出去的也应该是String类型,其才会接收到消息。

3.0中发布粘性事件

EventBus.getDefault().postSticky(new VoteEvent(obj));EventBus.getDefault().register(this);@Subscribe(sticky = true)

  什么时候使用sticy,当你希望你的事件不被马上处理的时候,举个栗子,比如说,在一个详情页点赞之后,产生一个VoteEvent,VoteEvent并不立即被消费,而是等用户退出详情页回到商品列表之后,接收到该事件,然后刷新Adapter等。其实这就是之前我们用startActivityForResult和onActivityResult做的事情。

priority = 1

相信大部分人知道该用法,值越小优先级越低,默认为0。


建议

  使用EventBus时,创建一个时间类,将需要传递的参数封装成一个类,创建实例,进行传递。

public class Event  {      public static class UserListEvent {          public List<User> users ;      }    public static class ItemListEvent {          public List<Item> items;      }    }  

混淆处理

-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);}

添加procesor

按照Markus Junginger的说法(EventBus创作者),在3.0中,如果你想进一步提升你的app的性能,你需要添加:
project的gradle中添加

buildscript {    dependencies {         classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'    }}

app的 gradle添加

apply plugin: 'com.neenbedankt.android-apt'dependence{compile 'de.greenrobot:eventbus:3.0.0-beta1'provided 'de.greenrobot:eventbus-annotation-processor:3.0.0-beta1'}2.在dependencies的下方添加apt {      arguments {          eventBusIndex "com.afei.test.MyEventBusIndex"          # 自定义的索引类    }  }  

通过rebuild即可自动生成索引类

添加索引到EventBus默认的单例中

EventBus.builder().addIndex(new MyEventBusIndex()).installDefaultEventBus();

这行代码做好在application的oncreate()中初始化,
其在编译的时候为注册类构建了一个索引,而不是在运行时,这样的结果是其让EventBus 3.0的性能提升了一倍,相比2.4来说,其会是它的3到6倍。

0 0
原创粉丝点击