您的位置:首页 > 其它

EventBus3.0的用法详解

2016-04-29 14:59 441 查看
1、导入组件

compile 'org.greenrobot:eventbus:3.0.0'


2、建立索引(建立索引速度会更快),不建立索引可以跳过第二步骤

1)在工程的gradle文件的dependencies中添加

classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8


2)在App的gradle文件中添加

apply plugin: 'com.neenbedankt.android-apt'
apt {
arguments {
//build会在包名下生成一个EventBusIndex类,在类中可以直接使用
eventBusIndex "com.yelong.androidframeproject.EventBusIndex"
}
}


3)在App的gradle文件的dependencies中添加

apt 'org.greenrobot:eventbus-annotation-processor:3.0.1'


4)编译项目,在/ProjectName/app/build/generated/source/apt/PackageName里面看到索引类

3、初始化EventBus

EventBus默认有一个单例,可以通过getDefault()获取,也可以通过EventBus.builder()构造自定义的EventBus,比如要应用我们生成好的索引时:

EventBus mEventBus = EventBus.builder().addIndex(new EventBusIndex()).build();

如果想把自定义的设置应用到EventBus默认的单例中,则可以用installDefaultEventBus()方法:

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

4、定义事件,新建一个类MessageEvent里面有个实例域message

5、在需要接受事件的Activity或者Fragment中注册和反注册,然后编写对应的接受事件

@Subscribe(threadMode = ThreadMode.POSTING)
public void onPostEvent(MessageEvent event) {
System.out.println("onPostEvent == " + event.getMessage());
//tvMessage.setText(event.getMessage());
//默认方式,在发送线程中执行,即post事件在主线程中发送就到主线程中执行
}

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMainEvent(MessageEvent event) {
System.out.println("onMainEvent == " + event.getMessage());
tvMessage.setText(event.getMessage());
//在UI主线程中执行
}

@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onBackEvent(MessageEvent event) {
System.out.println("onBackEvent == " + event.getMessage());
//在后台线程中执行
}

@Subscribe(threadMode = ThreadMode.ASYNC)
public void onAsyncEvent(MessageEvent event) {
System.out.println("onAsyncEvent == " + event.getMessage());
//强制在后台线程中执行
}


6、发送事件。可以在任何地方发送事件,不管时UI主线程还是子线程

EventBus.getDefault().post(new MessageEvent("你在干嘛呢"));
EventBus.getDefault().postSticky(new MessageEvent("你在干嘛呢"));


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

@Subscribe(threadMode = ThreadMode.MAIN,sticky = true,priority = 1)


说明:EventBus是跨线程通信,不能跨进程通信。

参考资料链接:

https://github.com/greenrobot/EventBus

https://mp.weixin.qq.com/s?__biz=MzI1NjEwMTM4OA==&mid=2651231761&idx=1&sn=3d43eb2a21556f820f12ee6f5fd87175&scene=1&srcid=0428oPNieSjz4Yzj13IISPSS&key=b28b03434249256b7ea15736404f037ec528b3028bab1dcf5657be35528009630d7179d8b70075085c4f6897ae51fb11&ascene=0&uin=NTkyMjI3NQ%3D%3D&devicetype=iMac+MacBookPro12%2C1+OSX+OSX+10.11.4+build(15E65)&version=11020201&pass_ticket=vfoQOJrCt3c0l2XN46zh5U1pJAJ4MuppOBXN915b2Ew%3D
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: