EventBus 学习记录
一、概述
EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者解耦。
二、使用方法
0x01 添加引用
Gradle:
compile 'org.greenrobot:eventbus:3.0.0'
Maven:
<dependency>
<groupId>org.greenrobot</groupId>
<artifactId>eventbus</artifactId>
<version>3.0.0</version>
</dependency>
0x02 基本使用
- (1) Define events:
主要是一个消息类,存储需要传递的消息,根据消息的内容可进行自定义。
public class MessageEvent {
public final int Code;
public final String message;
public MessageEvent(int code,String message){
this.Code = code;
this.message = message;
}
}
- (2) Prepare Subscribers
准备消息接受者的方法。当一个消息传递来的时候,消息接收者的方法就会被调用。
在3.0版本中可以直接使用注解来定义消息接收者的方法,而不必去写固定的消息接受的方法名。
@Subscribe
// 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);
}
消息接收者被调用的前提是在Bus中进行了注册。因此,在Activity或者Fragment里要对Bus进行注册。
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
- (3)Post Events
在任意的代码块中进行消息的发送。所有这册了这个消息类型的接收者都会接收到这个消息。
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
0x03 线程模式(ThreadMode)
EventBus 可以帮我们处理线程:事件会从一个线程发送到另一个线程中。一个通用的方法是处理主线程的改变。在Android中,UI的改变在主线程中进行处理。另一方面,网络请求,活着其它耗时的任务,不能在主线程中进行。EventBus帮助我们处理这些任务并且同步到主线程中(就不必使用AsyncTask这些了)。
在EventBus中,我们可以指定以下四种线程模型(ThreadMode)中的一个用来调用事件方法。(感觉这句理解的不太对啊,原文是下面的这句)
In EventBus, you may define the thread that will call the event handling method by using one of the four ThreadModes.
(英文水平有限,自己看英文,然后大致把意思翻译了一下。)
ThreadMode:POSTING
这个订阅者(方法)和post在同一个线程中。
@Subscribe(threadMode = ThreadMode.POSTING) // ThreadMode is optional here
public void onMessage(MessageEvent event) {
log(event.message);
}
ThreadMode:MAIN
订阅者将在Android的主线程(ui线程)中被调用。
// Called in Android UI's main thread
@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessage(MessageEvent event) {
textField.setText(event.message);
}
ThreadMode:BACKGROUND
订阅者将在后台线程中被调用。
// Called in the background thread
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void onMessage(MessageEvent event){
saveToDisk(event.message);
}
ThreadMode:ASYNC
订阅者将会在一个独立的线程中被调用,这个线程独立于主线程和发送时的线程。这个模型主要是用来处理一些耗时的操作,比如网络请求等。EventBus使用一个线程池来高效的复用线程,复用线程来自于异步的事件通知。
// Called in a separate thread
@Subscribe(threadMode = ThreadMode.ASYNC)
public void onMessage(MessageEvent event){
backend.send(event.message);
}
(今天先写到这里,我这渣子英文水平去翻译这个还是有些吃力啊,不过却是锻炼了英文水平。)