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 

CompositeDisaposableDisposableSubscription可以unsubscribe。但请确保您在stream结束时执行此操作。注意threading

+0

谢谢!还有一个问题:.unsubscribeOn真的从流中退订或者只说哪里(哪个线程)退订? – fitu

+0

默认情况下,如果调用onError()或onComplete(),它将取消订阅流。当您想要指定要取消订阅的线程时,unSubscribeOn()非常有用 –