在Reactive Java中,我们被告知.subscribe()
调用返回“订阅引用”。但是Subscription
是一个接口,而不是一个类。那么我们用什么样的对象来实现这个接口呢?我们对此有何控制权?
有一个类Subscriptions
可以创建并返回几种不同类型的Subscription
,但是它们可以用它们做什么?如果我写
Subscription mSub = Subscriptions.create(<some Action0>);
mSub = someObservable.subscribe();
我的刚刚创建的Subscription
不会被.subscribe()
调用返回的任何内容覆盖吗?你如何使用你创建的Subscription
?
(在一个有点相关的说明中,Subscriptions.unsubscribed()
的重点是什么,“返回订阅,取消订阅什么也不做,因为它已经取消订阅了。嗯?”
答案 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(...)