什么样的对象是反应式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(...)