http://note.youdao.com/noteshare?id=ae556eb40179a4c228b54b5490d896e8
1.简化子线程和主线程之间或两个子线程之间的消息传递
通常我们都会在一个线程中做一些耗时操作得到数据之后需要发送到另一个线程去处理数据(这个线程可以是主线程去更新UI,或子线程继续处理接下来的任务)。这些通信都需要用到Handler。我们需要定义Handler,并重写handleMessage方法去处理数据,在使用处定义Message对象携带数据并发送到指定的Handler中
2.代替BroadcastReceiver/Intent
不同于安卓的BroadcastReceiver/Intent,EventBus就是普通的java类,它提供很简单易用的API调用。EventBus适用于更多的场景,并不需要你麻烦的设置Intent,设置携带数据,然后从Intent中取出数据,或者定义广播和广播接受者。同时,EventBus的开销会低,对于输出传送方和接收方没有那么高的耦合。
3.简化数据传输
比如:(1)在一个Activity中横向同时加载两个Fragment,左边的ragment是列表,右边的Fragment是详情展示。这时候涉及到Activity和Fragment,两个Fragment之间的通信(2)当使用startService启动一个Service时,你需要和Service相互通信时(3)有些场景需要使用接口处理问题时(4)在应用程序运行时可能有多个界面,多处都需要使用到一个数据时,这个数据只是需要临时存储,并不需要落地时。
EventBus bus = EventBus.getDefault();
(1)自定义一个类,可以是空类,比如:
publicclassAnyEventType {
publicAnyEventType(){}
}
(2)在要接收消息的页面注册:
eventBus.register(this);
(3)发送消息
eventBus.post(newAnyEventType event);
(4)接受消息的页面实现(共有四个函数,各功能不同,这是其中之一,可以选择性的实现,这里先实现一个):
publicvoidonEvent(AnyEventType event) {}
(5)解除注册
eventBus.unregister(this);
1、onEvent
2、onEventMainThread
3、onEventBackgroundThread
4、onEventAsync
onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync
订阅优先级
EventBus.getDefault().register(this,priority);
在同一个分发线程中,高优先级的订阅者会比低优先级的订阅者先得到事件的分发。在不同ThreadMode的订阅者中优先级是没有效果的
取消事件分发
// Called in the same thread (default)publicvoidonEvent(MessageEventevent){// Process the event...
EventBus.getDefault()
.cancelEventDelivery(event) ;
}
注意:*事件通常被高优先级的订阅者取消。取消只能在ThreadMode为PostThread时,也就是onEvent方法中取消。*
粘性的事件
1.
EventBus.getDefault()
.postSticky(newMessageEvent("Hello everyone!"));
2.这段代码之后,一个新的Activity启动了,可以使用registerSticky去注册EventBus,这个注册操作会马上获得之前的发布的事件,在onEvent方法中执行。
EventBus.getDefault().registerSticky(this);
publicvoidonEventMainThread(MessageEvent event) {
textField.setText(event.message);
}
3.
EventBus.getDefault().getStickyEvent(Class eventType)
4*注意:可以使用removeStickyEvent方法移除之前发布的粘性事件。可以通过事件对象或者事件的类去移除。也可以去构建一个自定义的事件。但是要记住一个类型的事件只有一个会被保存*
Evenbus源码解析
http://a.codekk.com/detail/Android/Trinea/EventBus%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90
http://www.jianshu.com/p/acfe78296bb5
EvenBus3.0
订阅者
类似广播,但是有别于2.4版本,你不必再去约定OnEvent方法开头了(看不懂没关系):
@Subscribe(threadMode = ThreadMode.MainThread)publicvoidhelloEventBus(String message){
mText.setText(message);
}
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface Subscribe {
ThreadMode threadMode() default ThreadMode.POSTING;
boolean sticky() default false;
int priority() default 0;
}
3.sticky 粘性事件
关于粘性事件,可以参考Android的广播机制,其中有一个粘性广播,粘性广播的意思是:该广播发送后,会保存在内存中,如果后来有注册的Receiver与之匹配,那么该Receiver便会接收到该广播。那么粘性事件同理,在注册之前便把事件发生出去,等到注册之后便会收到最近发送的粘性事件(必须匹配)。注意:只会接收到最近发送的一次粘性事件,之前的会接受不到。
EventBus源码解读:
网友评论