好用,但是要用好不容易!
EventBus 介绍
官网地址:http://greenrobot.org/eventbus/
使用介绍地址:http://greenrobot.org/eventbus/documentation/
EventBus 使用场景
EventBus
是一个Android
和Java
的开源库,使用发布者/订阅者模式进行松散耦合。
事件发布订阅 就像是生活中的:你订阅了一家杂志的书刊,每到固定的时间,杂志社就会把书送给你。
Android
中对应的就是,我在某个页面需要得到某个数据或者某个对象,那么我在当前页面先订阅,那么在拥有该数据或者对象的操作中发送事件。我就能在对应的已经订阅了该数据或者该对象的页面得到发送的事件。
- 替换
Handler
刷新UI
问题 -
Activity
页面跳转数据传递 -
Fagment
页面切换数据刷新问题 - 数据该表通知页面及时刷新
- 等等...
使用
第一步:添加依赖
compile 'org.greenrobot:eventbus:3.1.1'
第二步:定义Java对象
public class MessageEvent {
public final String message;
public MessageEvent(String message) {
this.message = message;
}
}
第三步:准备订阅者
在Activity
或者Fragment
中的onResume()
和onPause()
中注册,再定义一个方法用来接受事件。
@Override
public void onResume() {
super.onResume();
EventBus.getDefault().register(this);
}
@Override
public void onPause() {
super.onPause();
EventBus.getDefault().unregister(this);
}
/**
* 下面是两种方式接收事件
* 第一个是:声明了在主线程中接收,可以进行 UI 相关的操作
* 第二个是:没有声明在主线程中接收,刷新 UI 可能会出现问题
*/
// This method will be called when a MessageEvent is posted (in the UI thread for Toast)
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(MessageEvent event) {
Toast.makeText(getActivity(), event.message, Toast.LENGTH_SHORT).show();
}
// This method will be called when a SomeOtherEvent is posted
@Subscribe
public void handleSomethingElse(SomeOtherEvent event) {
doSomethingWith(event);
第四步:发送事件
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
以上就完成了 EventBus 的简单使用~
上面说到了在处理事件时可以指定线程,它有以下四种线程模式:
- ThreadMode: POSTING
订阅者将在发布事件的同一线程中调用。这是默认的模式,也是EventBus
推荐使用的模式,因为它开销最小。使用该模式应该要快速响应,避免线程阻塞。使用例子如下:
// Called in the same thread (default)
// ThreadMode is optional here
@Subscribe(threadMode = ThreadMode.POSTING)
public void onMessage(MessageEvent event) {
log(event.message);
}
-
ThreadMode: MAIN
在UI
线程中调用。使用该模式应该要快速响应,避免线程阻塞。使用例子如下:
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
-
ThreadMode: MAIN_ORDERED
在UI
线程中调用,并且事件是有顺序的,按顺序返回。使用该模式应该要快速响应,避免线程阻塞。使用例子如下:
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN_ORDERED)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
-
ThreadMode: BACKGROUND
订阅者将在后台线程中调用。如果发布线程不是主线程,则将在发布线程中直接调用事件处理程序方法;如果发布线程是主线程,则EventBus使用单个后台线程,该线程将按顺序传递其所有事件。使用此模式的事件处理程序应快速返回以避免阻塞后台线程
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
-
ThreadMode: ASYNC
事件处理程序方法在单独的线程中调用,使用此模式的事件处理程序应快速返回以避免阻塞后台线程。
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
网友评论