2017-07-27 40 views
1

我知道,當您訂閱Observable時,您將獲得訂閱,您必須使用Android的生命週期取消訂閱。 因此,在片段或活動中訂閱的情況下,我使用onDestroy()取消訂閱。Android中的RxJava:當您沒有生命週期時,自動取消訂閱

但我的問題是,當我在沒有任何生命週期的地方進行訂閱時。例如在SyncAdapter中。在這種情況下(或多種情況)我如何「自動取消訂閱」來避免內存泄漏? 是否有任何好的做法說「我從來沒有訂閱過XXX的地方」,我打破了SyncAdapter中的此訂閱?

我想在這樣的事情:

compositeDisposable.add(
    Observable.just()... 
    ... 
    .doOnTerminate(compositeDisposable::dispose) 
    .subscribe(...) 
    ); 

回答

0

您不僅可以「自動取消」,但你也可以選擇要取消訂閱的線程。這是一個非常簡單的例子

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()非常有用 –