0
Observable.create(...)
を使用して非同期コードをラップしています。非同期コードは5秒間 "アクティブ"にする必要があり、その後停止する必要があります。RxJava 2:Observable.create()は、非同期コードがThread.sleep()を使用して終了するまで待機します。
Observable.<MyObject>create(emitter -> {
// Some async code
emitter.setDisposable(Disposables.fromRunnable(() -> {
// Stop the above async code
}));
// Wait for 5 seconds until the async code above has had enough time to finish its task.
Thread.sleep(5000);
if (!emitter.isDisposed()) {
// Stop the above async code
emitter.setDisposable(null);
}
})...
私はThread.sleep(5000)
が使用されているので、これが最善の方法であるのかはわからない:これは、私は現在、それを停止しています方法です。いくつかのRxJavaコードでこれを行うより良い方法はありますか?
Observable.<MyObject>create(emitter -> {
// Some async code
emitter.setDisposable(Disposables.fromRunnable(() -> {
// Stop the above async code
}));
})
.take(5, TimeUnit.SECONDS);
あなたはまだcreate
にセットアップDisposable
にあります
この非同期コードとはなんですか?それが単独で完了したかどうかを伝えることはできませんか?ソースを停止させることができるタイムアウト 'take()'オーバーロードがありますが、 'create'に' setDisposable'が必要です。 – akarnokd
@akarnokd非同期コードは、AndroidのNetwork Service Discovery(https://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover)です。リスナーが登録解除されるまで、ローカルネットワーク内のデバイスをスキャンします。 1回だけスキャンしたいので、手動で5秒後にリスナーの登録を解除してから、 'emitter.onComplete()'を呼び出す必要があります。 'take()'は完了してオブザーバブルを破棄しますか? –
Javadocと図[take()](http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#take-long-java.util.concurrent)を見てください。 TimeUnit-)。 – akarnokd