为了账号安全,请及时绑定邮箱和手机立即绑定

通过 RxJava 实现一个 Event Bus – RxBus

标签:
Android

这篇文章有三个部分:

  1. 关于什么是 Event Bus(事件总线)的快速指引(不译)

  2. 通过 RxJava 实现一个      RxBus

  3. 对于文章所题的这种方式的一些疑惑和回答

一、什么是 Event Bus(事件总线)

这部分由于篇幅太长,并且不是关键,所以略去,关于这部分,我假设你已经懂得了,如果不懂,可以看看 Square  Otto 或者 GreenRobot EventBus,再或者你可以看看 妹纸&gank.io 的源代码,这个项目使用到了 Otto RxJava

二、通过 RxJava 实现一个 RxBus

我已经发布了这个 使用 RxJava 的例子了: 一个使用 RxJava for Android 的教程 ,所以我在这里继续来解释 RxBus 的完整实现。这是其中有趣部分的实现:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

// 这是作为中间人调用的对象

public class RxBus   {

  

  private final Subject<object, object=""> _bus = new SerializedSubject<>(PublishSubject.create());

  

  public void send(Object o) {

    _bus.onNext(o);

  }

  

  public Observable<object> toObserverable()   {

    return _bus;

  }

} <br data-filtered="filtered"></object></object,>

这样就可以了,看得出我们已经有一个 Event Bus 可以使用啦,接下来就是使用方式的介绍:

通过这个 bus 发布一个事件:

[代码]java代码:

?

1

2

3

4

5

@OnClick(R.id.btn_demo_rxbus_tap)

public void onTapButtonClicked()   {

  

    _rxBus.send(new TapEvent());

}

在其他 Fragment 或者 Service 等地方监听这个事件:

[代码]java代码:

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

// 注意 要使用原本发布这个事件的那个 bus 实例才行

_rxBus.toObserverable()

    .subscribe(new Action1<object>() {

      @Override

      public void call(Object event) {

  

        if(event   instanceof TapEvent)   {

          _showTapText();

  

        }else if(event instanceof SomeOtherEvent) {

          _doSomethingElse();

        }

      }

    }); <br   data-filtered="filtered"></object>

在这个例子中,我们在绿色部分的 Frgament 中发布了一个点击事件,然后在蓝色部分的 Fragment 中监听响应这个事件。


三、对文章所题的这种方式的一些疑惑和回答

关于 Dead events,以及 RxBus 要怎么实现这点?

我们如果能够知道是否有观察者目前订阅了我们的 bus,在有些情况下是很有用的。例如,你使用一个 Event Bus 来处理 GCM 的推送通知,当你的 App 当前正在前台运行的时候,你不想发送通知栏通知,这时监听这个 “DeadEvent” 就很重要了。(译者注:来源于 Otto 中对于 DeadEvent 的用处解释:用来包装一个没有订阅者的事件,它不会被交付。)

例如,在我们最新发布的一个 App 中,我们增加了一个“发送中”的功能。当用户打开我们的 App 在使用,这时会有许多监听器正在监听这个 bus,我们不需要发送 通知栏消息,当我们的 App 在后台的时候,我们需要发送 通知栏消息 让用户获得一些聊天信息。当一个事件发布,如果没有订阅者在监听(注:如果应用或页面到了后台或者关闭,一些和生命周期挂钩的订阅,都会解除对事件的监听,所以这时可以说没有订阅者在监听啦),就发布一个 dead event。如果我们发出一个 dead event,推送通知栏消息就可以出现了。

那么 RxBus 要怎么实现这点?

事实上十分简单,在 1.x 版本的 RxJava 中有了一个很有用的方法:hasObservers(),使用这个方法就可以做到啦。

那么我是否应该使用 RxBus 来替代 Otto/EventBus?

如果你只是想简单地使用一个 Event Bus,你最好还是使用 Otto(特别推荐)或者 EventBus。Otto 通过注解可以有很清爽的 API,并且它使用起来也比较简单。

而如果你对 Rx 很熟悉,并且已经在你的项目中使用了 RxJava,同时你又想避免使用更多的依赖库,那么肯定说要试试我们的 RxBus 了!

原文链接:http://www.apkbus.com/blog-705730-60631.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消