Android studio 上如何使用EventBus?
第一步:导入第三方包
//eventBus所需要的包
compile 'de.greenrobot:eventbus:3.0.0-beta1'
2、新建Event类,根据项目需求,构建不同的Event类
public class FirstEvent { public String message; public FirstEvent(String message) { this.message = message; } }
3、发布事件
private void initView(){ btn=(Button)findViewById(R.id.btn); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EventBus.getDefault().post(new AnyEvent("nothing is impossible!")); } }); }
4、在订阅事件的activity上注册(在oncreate()/onresume()中注册,务必在ondestroy()/onpause()中取消注册)
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); //注册 EventBus.getDefault().register(this); }
5、订阅事件,有四种可选方式接收事件:
在3.0之前,EventBus还没有使用注解方式。消息处理的方法也只能限定于onEvent、onEventMainThread、onEventBackgroundThread和onEventAsync,分别代表四种线程模型。而在3.0之后,消息处理的方法可以随便取名,但是需要添加一个注解@Subscribe,并且要指定线程模型(默认为PostThread),四种线程模型,下面会讲到。
注意,事件处理函数的访问权限必须为public,否则会报异常。
【EventBus使用及优点】 onEvent(); ------------------------->接收事件和分发事件在同一个线程中执行
onEventMainThread(); ----------->接收事件永远在UI线程执行
onEventBackgroundThread(); --->分发事件在UI线程?启动子线程运行接收事件:在分发线程接收事件
onAsync(); ------------------------->直接另起线程接收事件
/** * 使用onEvent来接收事件,那么接收事件和分发事件在一个线程中执行 * @param event */ public void onEvent(AnyEvent event) { } /** * 使用onEventMainThread来接收事件,那么不论分发事件在哪个线程运行,接收事件永远在UI线程执行 * 可以用来更新UI * @param event */ public void onEventMainThread(AnyEvent event) { }/** * 使用onEventBackgroundThread来接收事件,如果分发事件在子线程运行,那么接收事件直接在同样线程 * 运行,如果分发事件在UI线程,那么会启动一个子线程运行接收事件 * @param event */ public void onEventBackgroundThread(AnyEvent event) { } /** * 使用onEventAsync接收事件,无论分发事件在(UI或者子线程)哪个线程执行,接收都会在另外一个子线程执行 * @param event */ public void onEventAsync(AnyEvent event) { }
6、在订阅事件的activity上取消注册(在oncreate()/onresume()中注册,务必在ondestroy()/onpause()中取消注册)
@Override protected void onDestroy() { super.onDestroy(); EventBus.getDefault().unregister(this); }
优点:
采用消息发布/订阅的一个很大的优点就是代码的简洁性,并且能够有效地降低消息发布者和订阅者之间的耦合度。
举个例子,比如有两个界面,ActivityA和ActivityB,从ActivityA界面跳转到ActivityB界面后,ActivityB要给ActivityA发送一个消息,ActivityA收到消息后在界面上显示出来。我们最先想到的方法就是使用广播,使用广播实现此需求的代码如下:
首先需要在ActivityA中定义一个广播接收器:
推荐阅读
- EventBus 3.0 从入门到精通——使用详解(二)
- 第三方库探究|What(EventBus的核心竟然只是这两个Map?)
- 事件|在java项目中使用EventBus的优缺点
- Android应用层|Android事件总线(一)EventBus3.0用法全解析
- 源码解析|Android EventBus3源码解析(下)
- EventBus 3.0 从入门到精通——EventBus的应用场景
- Java|EventBus使用
- EventBus|EventBus3.0——索引的使用
- EventBus的基本使用