【问题标题】:Understanding RxJava basics了解 RxJava 基础知识
【发布时间】:2016-04-12 09:55:39
【问题描述】:

我刚刚使用 RxJava 迈出了第一步,利用了 tutorial。我了解ObservableSubscriber 是什么。但是我在“连接”它们时遇到了问题。我刚刚想到了这样一个任务:一个活动 A 启动一个活动 B。活动 B 有一个按钮,您可以使用该按钮创建一个包含当前日期的Date。另一个按钮发出这个Date 并完成活动B。活动A 订阅发出的Date-Observable 并显示当前日期。 (我知道这通常是通过使用活动结果来完成的)。我有以下问题:

我可以通过这段代码在活动 B 中创建一个 Date-Observable(实例 mDate 的类型为 Date,并在活动 B 的其他位置创建):

Observable<Date> dateObservable =
            Observable.create(sub -> {
        sub.onNext(mDate);
        sub.onCompleted();
    });

但在活动 A 中,我必须订阅它。但是我没有提到活动 B 中的 Observable。我想过在我的 Application 类中静态创建 Observable,但我还不知道 mDate 的值。我可以在不实现“call()”方法的情况下以某种方式创建某种类型的 Observable(其中调用了 onNext()onCompleted())吗?那么我已经有了一个可以在我的 Aativity 中订阅的 Observable 实例。然后我可以在 Activity B 中实现“call()”方法?或者还有其他 RxJava 功能可以用来实现我描述的目标吗?

【问题讨论】:

标签: android rx-java observable


【解决方案1】:

你需要一个叫做ReplaySubject的东西。

在您的自定义 MyApplication 类中:

ReplaySubject<Date> dateSubject = ReplaySubject.create();

在活动 B 中:

ReplaySubject<Date> subject = ((MyApplication)getApplication()).getSubject();
subject.onNext(mDate);
subject.onCompleted();

在活动 A 中:

ReplaySubject<Date> subject = ((MyApplication)getApplication()).getSubject();
subject.subscribe(...);

【讨论】:

  • 谢谢,有帮助。但是现在我还是有点不满意。因为我必须使用Application 类作为“传递接口”,我想避免这种情况。我听说 RxJava 可用于在 EventBus 上发送事件。如何做到这一点?
  • @unlimited101,在大多数实现中,事件总线基本上是一个简单的可观察对象。您可以将其放入静态变量而不是 Application 并围绕它进行包装。据我所知,没有其他方法可以跨活动共享对象。
  • 通过 eventbus (github.com/greenrobot/EventBus) 你可以在服务、活动等 Android 组件之间发送数据。但我想在 RxJava 中实现这一点。
  • @unlimited101 如果您查看代码,例如EventBus.java,您会注意到它是作为单例实现的,并且它的实例存储在静态变量中。您可以通过在 Observable 周围创建一个包装器来制作类似的东西,该包装器将被实例化为静态变量。
  • 在大多数情况下,您的事件总线将是应用程序的一个字段、某个地方的静态变量或注入的单例(我会选择后者,obv.,但如果您愿意,其他人也可以不要在你的项目中使用依赖注入)
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
相关资源
最近更新 更多