什么样的对象是反应式Java订阅?

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

有类可以创建和返回几种不同类型的Subscription ,但一个人做了什么? 如果我写

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

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

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

简答:你不应该在意。

较长的答案:订阅给你两种方法:

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

您可以使用这些方法a)检查Observable链是否终止,b)是否过早终止Observable链,例如,如果用户切换到不同的Activity。

而已。 你不是故意暴露于内部的。 另外,您是否注意到没有resubscribe方法? 这是因为如果你想重新启动操作,你需要重新订阅Observable,给你一个新的订阅。

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

  • 默认实现; 避免像Subscription mSub;这样的声明Subscription mSub; 这将填补后者,并可能创建一个NPE。 如果您使用需要属性初始化的Kotlin,则更是如此。

  • 测试

在一个有点相关的说明中,Subscriptions.unsubscribed()是什么意思,它返回一个订阅,退订什么都不做,因为它已经退订了,呃?

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

在2.x中,有一个公共和内部版本的等价接口, Disposable 。 内部版本主要是用来替换一个终止的Disposable ,避免NullPointerException和空检查一般,并帮助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(...) 
    Interesting Posts