写在前面
当我们想通知其他组件或者某些事情发生时,我们通常使用观察者模式,所以在jdk1.5中已经帮助我们实现了观察者模式,只需要简单的继承一些类就可以快速使用,在Android中也有一个类似功能的开源库EventBus,可以很方便的帮我们实现观察者模式;
EventBus概述
EventBus的四个接收事件通知函数;
onEvent
如果你的事件在哪个线程发布的那么onEvent就会在哪个线程执行,也就是发布和接收是在同一线程的,使用这个方法时,在接收的函数onEvent不宜做耗时操作,不然会导致事件分发延时;
onEventMainThread
无论你的事件在哪个线程发布的,onEventMainThread都会在UI线程中执行,用于更新UI,不能做耗时操作;
onEventBackgroundThread
如果事件是在UI线程发布的,那么onEventBackgroundThread就会在子线程运行,假如事件本身就是在子线程发布的,那么onEventBackgroundThread则会直接运行在该子线程中;
onEventAsync
无论你在哪里发布事件,都会创建新的子线程去执行onEventAsync;
实践
新建测试类
1 2 3 4 5 6 7 8 9 | public class TestEvent { private String mMsg; public TestEvent(String msg) { this.mMsg = msg; } public String getMsg(){ return mMsg; } } |
发布事件
1 | EventBus.getDefault().post(new TestEvent("The old to the driver")); |
订阅通知
接收函数
1 2 3 | public void onEventMainThread(TestEvent event) { Log.i("收到消息了:"+event.getMsg()); } |
注意在你订阅的地方进行订阅:EventBus.getDefault().register(this);
取消订阅:EventBus.getDefault().unregister(this);
多个接收函数
1 2 3 4 5 6 7 8 9 10 11 | public void onEventMainThread(TestEvent event) { Log.i("TestEvent收到消息了:"+event.getMsg()); }
public void onEventMainThread(TestEvent2 event) { Log.i("TestEvent2收到消息了:"+event.getMsg()); }
public void onEvent(TestEvent3 event) { Log.i("TestEvent3收到消息了:"+event.getMsg()); } |
如果你一个地方订阅了多个接收函数,那么你发布的是哪个实例,EventBus就会调用哪个接收函数;
多个地方订阅同一接收函数
Activity1
1 2 3 | public void onEventMainThread(TestEvent event) { Log.i("Activity1收到消息了:"+event.getMsg()); } |
Activity2
1 2 3 | public void onEventMainThread(TestEvent event) { Log.i("Activity2收到消息了:"+event.getMsg()); } |
如果你多个地方订阅同一实例的接收函数,那么你一旦发布事件,那么这几个地方都会被执行;
总结
好了,归根到底,消息的接收反正是根据你发布的消息参数而定的,EventBus是Android下高效的发布/订阅事件总线机制,可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment,Activity,Service,线程之间传递数据,执行方法,特点是代码简洁,是一种发布订阅设计模式(Publish/Subsribe),或称作观察者设计模式;
共同学习,写下你的评论
评论加载中...
作者其他优质文章