一、EventBus介绍
Android optimized event bus that simplifies communication between Activities, Fragments, Threads, Services, etc. Less code, better quality.
正如作者所说,EventBus可以简化Activities, Fragments, Threads, Services之间信息传递的代码量,而且效率更高.
二、EventBus环境搭建
作者GitHub地址:EventBus
对Gradle或者maven的依赖参照作者GitHub下的Add EventBus to your project.
三、如何使用EventBus
这里使用EventBus去处理支付页面(后边描述为Pager1)与WXPayEntryActivity(后边描述为Pager2)之间的信息传递。Pager1调起微信支付客户端的支付页面,点击左上角的返回按钮,返回到Pager1,Pager1接受Pager2发送过来的状态回调.
1.创建你的事物消息类
public class PayMessageEvent {
private int CallBackStatus;
public PayMessageEvent(int CallBackStatus) {
this.CallBackStatus = CallBackStatus;
}
public int getWXPayCallBackStatus() {
return CallBackStatus;
}
}
2.注册subscriber
EventBus.getDefault().register(this);
3.发送事件
EventBus.getDefault().post(newPayMessageEvent(0));
4.接受消息
框架的ThreadMode总共有4种:
(1)POSTING----onEvent
Subscriber will be called in the same thread, which is posting the event. This is the default. Event delivery implies the least overhead because it avoids thread switching completely. Thus this is the recommended mode for simple tasks that are known to complete is a very short time without requiring the main thread. Event handlers using this mode must return quickly to avoid blocking the posting thread, which may be the main thread.
如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
(2)MAIN----onEventMainThread
Subscriber will be called in Android's main thread (sometimes referred to as UI thread). If the posting thread is the main thread, event handler methods will be called directly. Event handlers using this mode must return quickly to avoid blocking the main thread.
如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
(3)BACKGROUND----onEventBackground
Subscriber will be called in a background thread. If posting thread is not the main thread, event handler methods will be called directly in the posting thread. If the posting thread is the main thread, EventBus uses a single background thread, that will deliver all its events sequentially. Event handlers using this mode should try to return quickly to avoid blocking the background thread.
如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行
(4)ASYNC----onEventAsync
Event handler methods are called in a separate thread. This is always independent from the posting thread and the main thread. Posting events never wait for event handler methods using this mode. Event handler methods should use this mode if their execution might take some time, e.g. for network access. Avoid triggering a large number of long running asynchronous handler methods at the same time to limit the number of concurrent threads. EventBus uses a thread pool to efficiently reuse threads from completed asynchronous event handler notifications.
使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.
这里我们使用onEventMainThread
@Subscribe
public void onEventPostThread(PayMessageEvent payMessageEvent) {
//Do your business.
}
5.解绑EventBus
EventBus.getDefault().unregister(this);
四、总结
通过使用Event对一些信息的传递,确实使代码更加简洁易懂,之后会对EventBus的源码进行深入的了解。