EventBus 3.0 简单使用

功能:通过解耦发布者和订阅者简化Android事件传递
EventBus可以代替Android传统的Intent,Handler,Broadcast或接口函数,在Fragment,Activity,Service线程之间传递数据,执行方法。

特点:代码简洁,是一种发布订阅设计模式(观察者设计模式)

使用场景
用于线程间的通讯代替handler或用于组件间的通讯代替Intent
广泛用于团购,商城,社交等应用,比如易大师APP,易宸锋Application…
实践证明已经有一亿多的APP中集成了EventBus
优势编辑
简化了组件间的通讯。
分离了事件的发送者和接受者。
在Activity、Fragment和线程中表现良好。
避免了复杂的和易错的依赖关系和生命周期问题。
使得代码更简洁,性能更好。
更快,更小(约50k的jar包)。

1.下载 eventBus 3.0.jar:DownLoad
2.导入jar eventBus 3.0.jar 到android工程
3.注册

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //注册eventbus
        EventBus.getDefault().register(this);
    }

4.在activity onDestroy 调用是反注册

@Override
    protected void onDestroy() {
        //反注册
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }

5.定义事件

public class MessageEvent {

    private String message;

    public MessageEvent(String message) {
        this.message = message;
    }
    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

6.订阅者 @Subscribe

    @Subscribe(threadMode = ThreadMode.MainThread)
    public void onMoonEvent(MessageEvent messageEvent){
        Log.i(TAG, Thread.currentThread().getName()+"收到");
        Log.i(TAG, messageEvent.getMessage()+"收到");
    }

7.发送事件

  ...
  //事件发送
EventBus.getDefault().post(new myMessage("事件"));
  ...
  ...


ThreadMode

PostThread(默认)[发布事件和接收事件是同一线程]:

该事件在哪个线程发布出来的,事件处理函数就会在这个线程中运行,也就是说发布事件和接收事件在同一个线程。任何事件处理情景使用这种模式必须保证能够快速地返回结果,否者可能将引起线程阻塞,当发布事件的线程是主线程时,还可能会出现ANR

MainThread[主线程,UI更新操作]:

不论事件是在哪个线程中发布出来的,该事件处理函数都会在UI线程中执行,任何事件处理使用这种模式必须保证快速地返回结果,从而避免阻塞主线程,该方法可以用来更新UI,但是不能处理耗时操作。

BackgroundThread [后台线程,不允许进行UI更新操作]:

当发布事件的线程不是主线程时,事件处理方法将会立即在该线程中被调用;如果发布时间的线程是主线程,EventBus会使用一个单例的后台线程调用事件处理函数,该后台线程将会按照时间顺序处理并交付所有的事件,任何事件处理场景使用这种模式必须保证快速地返回结果,从而避免阻塞线程。

Async[用于耗时操作]:

事件处理方法将会在异步的线程中被调用。该异步线程既不是主线程,也不是事件发布线程,在该模式下,发布事件不必等待事件处理方法执行完毕。在事件处理方法执行诸如网络请求等需要花费一定时间的任务时,推荐使用该模式。在使用过程中为了限制并发线程的数量,尽量避免在同一时间段内触发过多需要长时间执行的异步处理方法。


黏性事件

1.订阅黏性事件

//sticky=true
@Subscribe(threadMode = ThreadMode.MainThread,sticky=true)
    public void onMoonEvent(MessageEvent messageEvent){
        Log.i(TAG, Thread.currentThread().getName()+"收到");
        Log.i(TAG, messageEvent.getMessage()+"收到");
}

2.推送黏性事件

EventBus.getDefault().postSticky(new myMessage("黏性事件"));

3.注册即可接收黏性事件


Priority 优先级
优先级必须针对同一类型(ThreadMode)的观察者,priority值越大,越先收到事件或消息。

你可能感兴趣的:(android)