RXBus的翻译

来源:互联网 发布:linux 虚拟主机配置 编辑:程序博客网 时间:2024/06/08 02:02

这篇文章是RxBus的权威文章的翻译,原文,也算是写Retrofit+RxJava学习的开端 ,在以后的博客中会陆续介绍这种框架使用的好处(可能不会连续发布)。
这篇文章有三个部分:
1.事件总线快速入门
2.用RxJava实现事件总线
3.这种方法的离别思念
“RxBus”将不会成为一个库。实现事件总线RxJava是如此容易以至于它不能作为一个独立的库。
第1部分:什么是事件总线?
让我们来谈谈两个似乎相似的概念:观察者模式和发布 - 订阅模式。
观察者模式
这是一个发展模式,借助此,你的类或主对象(被称为可观察者)利用相关信息(事件)通知其他感兴趣的类或对象(称为观察者)。
发布 - 订阅模式
发布 - 订阅模式的目标和观察者模式的目标是完全一样的,即你想要一些其他的类来了解正在发生的某些事件。
尽管如此,观察者模式和发布 - 订阅模式之间存在一个重要的语义差别:发布 - 订阅模式的重点是外界“广播”的消息。观察者并不关注事件传给谁,而只关注事件是否已经传出。换句话说,观察者(发布者)并不关注谁是观察员(订阅者)。
为什么匿名?
它允许这个东西叫做“脱钩”,这是计算机编程具有良好的口碑。在设计中,你想尽可能的保持低耦合。
通常情况下,你会期望发布者对每个它需要通知的用户有直接的了解,所以当事件或消息已准备就绪时,它可以去通知他们每个人。但随着事件的总线的出现,发布者被解除该任务,并且这种独立性有所帮助,因为发布者和订阅者不必有建立两者之间相关性的逻辑代码。
换句话说“自觉低耦论”是你的代码在书写时就应该所思考的,这是程序员应该有的水平。
如何匿名?
在发布 - 订阅模式中一个很自然的问题是:你如何真正地实现发布者和订阅者之间的匿名?一个简单的方法是得到一个中间人,让那个中间人负责所有的通信。而事件总线就是这样的一个中间人。
事件总线就是这么简单。
常用于Android的使用的两个事件总线库是otto和EventBus。网上有大量的帖子解释如何在你的手机应用程序中实现它们。
第2部分:用总线RxJava实现事件(??是“在”还是“用”)
我已经将使用Android上RxJava的显示世界的例子粘贴在这个GitHub库上,所以我会坚持展示其完整的实现方式。下面是执行的部分代码:

// this is the middleman objectpublic 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;  }}

你现在有一个事件总线可以使用了。
这是你如何将事件发布到总线:

@OnClick(R.id.btn_demo_rxbus_tap)public void onTapButtonClicked() {    _rxBus.send(new TapEvent());}

这是你如何倾听来自其他片段/服务等。

_rxBus.toObserverable()    .subscribe(new Action1<Object>() {      @Override      public void call(Object event) {        if(event instanceof TapEvent) {          _showTapText();        }else if(event instanceof SomeOtherEvent) {          _doSomethingElse();        }      }    });

在这个例子中,我们后从顶部片段(绿色部分)的事件,并从底部片段(蓝色部分)中(通过总线)收听。
在下面这个例子中,我们从顶部片段(绿色方)发布事件,并从底部片段(蓝色部分)收听(通过事件总线)。
第3部分 - 离别的思念
死亡事件
在一些情况下,知道是否有观察者监听当前总线是非常有用的。比如,如果你使用事件总线来处理你的GCM推送通知),如果应用程序是在前台 ,此时你不希望发送推送通知,这时,监听“死亡事件”是非常重要的。
例如,在不久前发布的婚礼派对,我们增加了“信息”到我们的应用程序。如果用户的应用程序开启(因而具有至少一个或更多的听众到总线),我们不会发送推送通知,但如果他们的应用程序在后台,那么我们发送推送通知,让他们知道聊天信息。当一个事件被发布到事件总线后,如果没有用户在听,会返回一个死亡事件。如果我们得到一个死亡事件,推送通知的将被发送出去。
你将怎样利用RxBus来实现呢?
事实上,这很容易。受试者有一个有用的方法hasObservers,这将准确的告诉我们实现方式。这被添加RxJava的1.x release 中,所以你必须要安装RxAndroid的最新版本才能看到这种方法(0.23.0)。
如果你只是想在Andr​​oid应用程序中使用事件总线,你可能最好使用otto(强烈推荐)或EventBus库 。Otto有一个由注解推动的干净的API,可能更为简单易用。

虽然这篇文章写得很好,翻译的不好,以下的博客将会介绍EventBus的一般使用和RXJava及RxBus的使用。

0 0