android学习笔记

EventBus使用说明

2019-08-29  本文已影响0人  鼾声鼾语

EventBus是一款针对Android优化的发布/订阅事件总线。主要功能是替代Intent,Handler,BroadCast在Fragment,Activity,Service,线程之间传递消息.优点是开销小,代码更优雅。以及将发送者和接收者[解耦]

EventBus 这么棒,那我们有组建通信就用 EventBus 吧。
还真是人无完人,物无完物。EventBus 也有着它的致命弱点。EventBus 最大的缺点在于其逻辑性,直接看其代码,一不小心根本看不通有没有?另外一个问题是,当程序较大后,观察者独有的接口膨胀缺点也会伴随着你的项目,你能想象很多 Event 后缀类的感觉吗?

综上,EventBus 由于其针对统一进程,所以在某些复杂的情况下单纯依靠接口回调不好处理组件通信的时候,直接去尝试 EventBus 吧。

说了这么多,在广播和 EventBus 这个十字路口犹豫不决的时候,还会纠结选择吗?

使用EventBus 对于程序控制很方便,但是一直有一种情况用不了EventBus,就是在事件的接收方还没有启动的情况下怎么发广播: 如有A,B, 两个Activity , App当前处在 A Activity 现在要向B传递一个值并且启动B Activity, 正常情况下在A 发送 EventBus.getDefault().post(new Event()); 但是有一个问题,此时B还没有启动, B也没办法成功接收这个事件。那怎么解决

public class AActivity extends Activity {
  // 某个点击事件
  @Override 
  public void onClick(View v) {
    Event event= new Event(10);
    // 发布Sticky事件
    EventBus.getDefault().postSticky(event);
    // 跳转到B页面
    Intent intent = new Intent(this, BActivity.class);
    startActivity(intent);
  }
}

最后我们看看BActivity如何接收数据。

public class BActivity extends Activity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    // 以Sticky的形式注册
    EventBus.getDefault().registerSticky(this);
  }
@Subscribe(threadMode = ThreadMode.MAIN)
  public void receiveUser(Event event){
     // 这里实现你的逻辑即可, event即为传递过来的Event对象
//https://blog.csdn.net/a1078058302/article/details/83589199

//在EventBus 3.0之前我们必须定义以onEvent开头的那几个方法,分别//
//是onEvent、onEventMainThread、onEventBackgroundThread和
//onEventAsync,而在3.0之后事件处理的方法名可以随意取,不过需要
//加上注解@subscribe,并且指定线程模型,默认是POSTING。

  }
}

总结为三个函数:
sticky表示的是粘性发送,表示先发送消息,在注册接受体然后接受消息
所谓的黏性事件,就是指发送了该事件之后再订阅者依然能够接收到的事件。使用黏性事件的时候有两个地方需要做些修改。一个是订阅事件的地方,这里我们在先打开的Activity中注册监听黏性事件:
1,EventBus.getDefault().postSticky(event);
2, EventBus.getDefault().registerSticky(this);
3,@Subscribe(threadMode = ThreadMode.MAIN)
private void receiveUser(Event event){
// 这里实现你的逻辑即可, event即为传递过来的Event对象
}
//参考https://www.jianshu.com/p/e7d5c7bda783
//https://www.jianshu.com/p/a040955194fc

实践如下:
EventBus.getDefault().register(this);
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true)
public void receiveUser(InformationEvent event){
}
EventBus.getDefault().postSticky(event);

image.png
image.png
上一篇 下一篇

猜你喜欢

热点阅读