发表于: 2018-12-21 22:39:17

0 898


一、今天完成的事情

当我们进行项目开发的时候,往往是需要应用程序的各组件、组件与后台线程间进行通信,比如在子线程中进行请求数据,当数据请求完毕后通过Handler或者是广播通知UI,而两个Fragment之家可以通过Listener进行通信等等。当我们的项目越来越复杂,使用Intent、Handler、Broadcast进行模块间通信、模块与后台线程进行通信时,代码量大,而且高度耦合,EventBus能够简化各组件间的通信,让代码书写变得简单,能有效的分离事件发送方和接收方(也就是解耦的意思),能避免复杂和容易出错的依赖性和生命周期问题。

EventBus三要素

  • (1)Event  事件
  •         它可以是任意类型。
  • (2)Subscriber 事件订阅者
  •          在EventBus3.0之前我们必须定义以onEvent开头的那几个方法,分别是onEvent、onEventMainThread、 onEventBackgroundThread和onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要加上注解@subscribe(),并且指定线程模型,默认是POSTING。
  • (3)Publisher 事件的发布者
  •          可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。

EventBus3.0有四种线程模型:

POSTING (默认)  表示事件处理函数的线程跟发布事件的线程在同一个线程。

MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。

BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。

ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。


使用

自定义事件类Event

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;
  }
}

注册事件

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

解除注册

@Override
protected void onStop() {
  super.onDestroy();
  EventBus.getDefault().unregister(this);
}

发送事件

EventBus.getDefault().post(messageEvent);

处理事件

@Subscribe(threadMode = ThreadMode.MAIN)
public void XXX(MessageEvent messageEvent) {
  ...
}


二、明天计划的事情

能够接收到对方发送的消息,但没有正确显示在界面上,点击通知没有正常跳转,明天解决这些问题


三、遇到的问题

四、收获

EventBus



返回列表 返回列表
评论

    分享到