【问题标题】:Replace observer pattern with RxJava in Android在 Android 中用 RxJava 替换观察者模式
【发布时间】:2016-11-01 20:30:56
【问题描述】:

我已经开始学习 RxJava 和 RxAndroid。我想用 RxJava 替换我的观察者模式。观察者模式类似于具有注册和取消注册方法的 Android LocationManager 类。 “可观察”类(不是指 rx.Observable)在其自己的线程(HandlerThread)中工作,并拥有侦听器及其 Handler 对象的映射,并且每个侦听器在其线程中被调用(通过 Handler)。我认为这很清楚。那么问题是如何使用 RxJava 来实现呢?是否有意义?我已阅读有关 PublishSubject 和 Subscriber 的信息,但我不知道如何在其线程中运行我的 Observable。我不想使用“subscribeOn”方法,因为订阅者不会创建 Observable,而只会订阅在自己的线程中接收通知。感谢您的任何建议。

【问题讨论】:

  • 嗨,RxJava 为你实现了观察者模式。您只需创建数据流然后订阅。您可以通过运算符组成不同的观察者。 RxJava 并不依赖于线程。事实上,RxJava 默认是单线程的。请看看这本书“Reactive Programming with RxJava”(shop.oreilly.com/product/0636920042228.do)。它将通过 Android 示例引导您了解 RxJava 的每一个细节。

标签: android multithreading rx-java observer-pattern rx-android


【解决方案1】:

您的一般方法是一个很好的方法。让我为你充实一些方面。

让我们假设您的可观察类负责一个随时间变化的值。以前,您将注册一个观察者,并且可观察对象会在其值更改时提醒每个观察者。假设您正在观察颜色变化。 (警告:下面是未经测试的代码。我已经使用类似的代码将观察者模式适配到 RxJava 中。)

PublishSubject<Color> ps1 = new PublishSubject<>(); // your observable class
Observable<Color> observable = ps1.observeOn(Schedulers.newThread());
...
// handler in another thread
Subscription sub = observable.subscribeOn(myThreadScheduler).subscribe(myHandler);

现在,您的处理程序将在myThreadScheduler 指定的线程上调用。您也可以通过sub.unsubscribe()取消您的观察。

【讨论】:

  • 好的,但是多个观察者呢?我的 Observable 是一个单例,所以只有一个工作线程。我想观察者不应该调用 subscribeOn 方法。我是对的?
  • 每个观察者都会执行最后一行。 subscribeOn() 所做的是执行线程之间的数据传输。
猜你喜欢
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2016-02-20
  • 2023-04-10
  • 1970-01-01
  • 2011-07-07
相关资源
最近更新 更多