Android中的RxJava:当您没有生命周期时,自动取消订阅
问题描述:
我知道,当您订阅Observable时,您将获得订阅,您必须使用Android的生命周期取消订阅。 因此,在片段或活动中订阅的情况下,我使用onDestroy()取消订阅。Android中的RxJava:当您没有生命周期时,自动取消订阅
但我的问题是,当我在没有任何生命周期的地方进行订阅时。例如在SyncAdapter中。在这种情况下(或多种情况)我如何“自动取消订阅”来避免内存泄漏? 是否有任何好的做法说“我从来没有订阅过XXX的地方”,我打破了SyncAdapter中的此订阅?
我想在这样的事情:
compositeDisposable.add(
Observable.just()...
...
.doOnTerminate(compositeDisposable::dispose)
.subscribe(...)
);
答
您不仅可以“自动取消”,但你也可以选择要取消订阅的线程。这是一个非常简单的例子
Observable<Object> source = Observable.using(
() -> {
System.out.println("Subscribed on " + Thread.currentThread().getId());
return Arrays.asList(1,2);
},
(ints) -> {
System.out.println("Producing on " + Thread.currentThread().getId());
return Observable.from(ints);
},
(ints) -> {
System.out.println("Unubscribed on " + Thread.currentThread().getId());
}
);
source
.unsubscribeOn(Schedulers.newThread())
.subscribe(System.out::println);
输出应该
Subscribed on 1
Producing on 1
1
2
Unubscribed on 11
每CompositeDisaposable
或Disposable
或Subscription
可以unsubscribe
。但请确保您在stream
结束时执行此操作。注意threading
。
谢谢!还有一个问题:.unsubscribeOn真的从流中退订或者只说哪里(哪个线程)退订? – fitu
默认情况下,如果调用onError()或onComplete(),它将取消订阅流。当您想要指定要取消订阅的线程时,unSubscribeOn()非常有用 –