什么样的对象是Reactive Java订阅?

时间:2017-02-20 16:09:56

标签: java rx-java reactive-programming

在Reactive Java中,我们被告知.subscribe()调用返回“订阅引用”。但是Subscription是一个接口,而不是一个类。那么我们用什么样的对象来实现这个接口呢?我们对此有何控制权?

有一个类Subscriptions可以创建并返回几种不同类型的Subscription,但是它们可以用它们做什么?如果我写

Subscription mSub = Subscriptions.create(<some Action0>); 
mSub = someObservable.subscribe(); 

我的刚刚创建的Subscription不会被.subscribe()调用返回的任何内容覆盖吗?你如何使用你创建的Subscription

(在一个有点相关的说明中,Subscriptions.unsubscribed()的重点是什么,“返回订阅,取消订阅什么也不做,因为它已经取消订阅了。嗯?”

3 个答案:

答案 0 :(得分:2)

简短回答:你不应该在乎。

更长的答案:订阅为您提供了两种方法:

  • unsubscribe(),导致订阅终止。
  • isUnsubscribed(),检查是否已经发生。

您可以使用以下方法:a)检查Observable链是否终止,以及b)是否过早终止,例如,如果用户切换到其他Activity。

就是这样。您没有故意接触内部。另外,您是否注意到没有resubscribe方法?那是因为如果你想重新开始操作,你需要重新订阅Observable,给你一个新的订阅。

答案 1 :(得分:1)

如您所知,Subscription用于保留对正在进行的Observable的引用,主要用于资源管理。例如,在Android应用程序中,当您更改Activity(屏幕)时,您会刷新旧版Activity Observable。在这种情况下,Subscription实例由.subscribe()(如您所述)给出并存储。那么,为什么会直接创建Subscription,尤其是Subscriptions.unsubscribed()?我遇到了两个案例:

  • 默认实施;避免像后面填充的Subscription mSub;这样的声明,可以创建一个NPE。如果您使用需要属性初始化的Kotlin,尤其如此。

  • 测试

答案 2 :(得分:0)

  

在一个有点相关的说明中,Subscriptions.unsubscribed()的重点是什么,&#34;返回一个未取消订阅的订阅,因为它已经取消订阅。咦?

在1.x中,当控件从RxJava返回到您的代码时,Subscriptions.unsubscribed()用于返回操作已完成(或从不首先运行)的Subscription实例。由于取消订阅是无状态和常量状态,因此返回的Subscription是单身,因为仅通过查看界面Subscription,没有(合理的)方法来区分已完成/未订阅的Subscription来自另一个人。

在2.x中,有一个公共和内部版本的等效接口Disposable。内部版本主要用于交换带有终止版本的实时Disposable,一般避免NullPointerException和null检查,并在某种程度上帮助GC。

  

与他们有什么关系?

通常您不必担心Subscriptions.create();它是为您提供资源的情况而提供的,您希望将其附加到最终订阅者的生命周期中:

FileReader file = new FileReader ("file.txt");

readLines(file)
.map(line -> line.length())
.reduce(0, (a, b) -> a + b)
.subscribe(new Subscriber<Integer>() {
     {
         add(Subscriptions.create(() -> {
             Closeables.closeSilently(file); // utility from Guava
         });
     }
     @Override public void onNext(Integer) {
         // process
     }
     // onError(), onCompleted()
}); 

此示例演示了一种使用方式,但仍然可以通过using来表达:

Observable.using(
    () -> new FileReader("file.txt"), // + try { } catch { }
    file -> readLines(file).map(...).reduce(...),
    file -> Closeables.closeSilently(file)
)
.subscribe(...)