EventBus 3使用文档(一)
来源:互联网 发布:淘宝跟天猫的区别 编辑:程序博客网 时间:2024/06/08 03:41
在使用EventBus之前,请先确保EventBus已经被添加到你的项目中。添加方法(gradle):
compile 'org.greenrobot:eventbus:3.0.0'
点击查看:Javadoc文档
三步使用EventBus
步骤一:定义事件(Event)
事件应当用POJO(简单Java对象)对象定义,没有任何依赖要求。
public class MessageEvent { public final String message; public MessageEvent(String message) { this.message = message; }}
步骤二:准备好订阅者(Subscriber)
订阅者通过订阅方法(subscriber method)来处理发出的事件。他们需要用@Subscribe
来定义(即在方法上加上该注解)。EventBus 3的订阅方法的名字可以随意取,而不像EventBus 2对名字有特定的要求。
// 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@Subscribepublic void handleSomethingElse(SomeOtherEvent event) { doSomethingWith(event);}
写好订阅方法后,订阅者还需要把他们自己注册到EventBus中,当然合适的时候还要反注册。只有在注册后,订阅者才会收到事件。在Android的Activity和Fragment中,我们通常会根据他们的生命周期来注册。
@Overridepublic void onStart() { super.onStart(); EventBus.getDefault().register(this);}@Overridepublic void onStop() { EventBus.getDefault().unregister(this); super.onStop();}
步骤三:发布事件
可以在项目的任何地方调用发布事件的方法,所有在那一刻已经注册并且匹配事件类型的订阅者都会收到该事件。
EventBus.getDefault().post(new MessageEvent("Hello everyone!"));
线程投递(线程模型)
EventBus可以为你处理线程相关问题,比如:事件处理和事件发送可以不在同一个线程上。一种常见的用法就是在处理UI的改变上。在Android系统中,UI必须在UI线程(主线程)操作,而网络与其他耗时操作却不能在主线程上做。EventBus可以帮你处理这些杂事,而不需要你自己使用AsyncTask等来处理线程切换。
线程模型1:POSTING(发布者线程)
订阅者会在发布事件所在的线程被执行。这是默认行为。事件分发会以这样的方式同步完成:所有的订阅者会在发布事件方法完成之前把事件处理完成(译者注:post方法执行完时,所有的订阅者也把事件都处理好了)。这个线程模型占用资源最少,因为它完全不需要线程切换。所以,我们将它作为推荐模式。这样一来,很多简单的任务都能在很短的时间内完成,而不需要等着切到主线程再去做。但是,使用这样的线程模型要求订阅方法能在很短的时间内完成,否则如果是主线程发布的事件,就会导致主线程堵塞。下面是一个例子:
// Called in the same thread (default)// ThreadMode is optional here@Subscribe(threadMode = ThreadMode.POSTING)public void onMessage(MessageEvent event) { log(event.message);}
线程模型2:MAIN(主线程)
订阅者一定会在主线程(有时跟UI线程是一回事)被调用。如果发布事件的线程就是主线程,订阅方法会被直接调用(就像POSTING线程模型一样同步完成)。使用这种线程模型,要求订阅方法必须在很短的时间内完成,否则主线程必定会堵塞。例子:
// Called in Android UI's main thread@Subscribe(threadMode = ThreadMode.MAIN)public void onMessage(MessageEvent event) {textField.setText(event.message);}
线程模型3:BACKGROUND(后台线程)
订阅者会在后台线程被调用。如果发布事件的线程不是主线程,订阅方法就会被直接在发布事件的线程调用;如果发布事件的线程是主线程,EventBus会使用一个单独的后台线程依次调用订阅方法。使用这种线程模型时,订阅方法应该占用尽可能短的时间以防止阻塞后台进程(译者注:因为订阅方法是依次被调用的,前一个订阅方法不完成,后一个订阅方法就不会被调用)。
// Called in the background thread@Subscribe(threadMode = ThreadMode.BACKGROUND)public void onMessage(MessageEvent event){ saveToDisk(event.message);}
线程模型4:ASYNC(异步线程)
所有订阅方法会同时在单独的线程被调用。这通常是独立于发布事件的线程和主线程的。发布事件时绝不会等待订阅方法的完成。当需要消耗较长时间来完成一个订阅方法时,应该使用这种线程模型,比如网络访问。应当避免同时触发太多的长耗时操作来限制并发线程数量。EventBus使用了线程池来有效重用线程,已经完成了异步事件通知的线程会被回收利用起来。
// Called in a separate thread@Subscribe(threadMode = ThreadMode.ASYNC)public void onMessage(MessageEvent event){ backend.send(event.message);}
- EventBus 3使用文档(一)
- Eventbus 3官方文档翻译(一)
- EventBus 3使用文档(二)
- EventBus 3使用文档(三)
- EventBus 3使用文档(四)
- EventBus使用(一)
- EventBus使用(一)
- EventBus使用(一)
- EventBus使用详解(一)
- 《EventBus 简易使用(一)》
- EventBus使用详解(一)
- EventBus使用详解(一)—— 初步使用EventBus
- EventBus的使用详解(一)--初步使用EventBus
- EventBus的使用详解(一)--初步使用EventBus
- EventBus源码分析(一):EventBus的使用
- Android中EventBus使用详解(一)
- eventbus的使用(一)简洁易懂
- EventBus的简单使用(一)
- Python实战小程序——经典的python练习题
- numa distance
- 构造器Constructor是否可被override?
- 从分布式一致性谈到CAP理论、BASE理论
- IOS 四种保存数据的方式
- EventBus 3使用文档(一)
- Java设计模式之单例模式(Singleton Pattern)
- this指针 构造函数
- OpenCV 90°旋转
- linux nc命令相互发消息及传文件
- transcode_init()函数介绍
- CSS-字体
- 最小的应用(tkinter,Python3.x )
- 机器学习模型评价指标 -- 混淆矩阵