2017-07-27 8 views
1

Observableを購読すると、Androidのライフサイクルを使用して購読を解除する必要があることがわかります。 したがって、フラグメントまたはアクティビティのサブスクリプションの場合、私はonDestroy()でサブスクライブを解除します。AndroidのRxJava:ライフサイクルを持たない場合のサブスクリプションからの自動退会

しかし私の問題は、私がライフサイクルを持たない場所でサブスクリプションを行うときです。たとえば、SyncAdapterの場合。この場合(またはケース)、どのようにしてメモリリークを回避するために「自動退会」することができますか? SyncAdapterでこのサブスクリプションで壊れている「XXXの場所には絶対購読しない」というような良い習慣はありますか?

私はこのような何かに考えていた:

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

答えて

0

を使用すると、「自動退会」が、また、あなたはあなたが退会したいスレッドを選択することができないだけ。これは、出力が

Subscribed on 1 
Producing on 1 
1 
2 
Unubscribed on 11 

すべてCompositeDisaposableまたはDisposableまたはSubscriptionできunsubscribeである必要があり、非常に簡単な例

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); 

です。しかし、streamが終了したら必ず実行してください。 threadingに注意してください。

+0

ありがとうございます!もう1つの質問:.unsubscribeOn本当にストリームから退会するか、退会するのはどこのスレッド(どのスレッド)かだけですか? – fitu

+0

デフォルトでは、onError()またはonComplete()が呼び出された場合、ストリームの登録が解除されます。 unSubscribeOn()は、サブスクライブを解除するスレッドを特定する場合に便利です –

関連する問題