2017-12-15 3 views
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にあります

+1

この非同期コードとはなんですか?それが単独で完了したかどうかを伝えることはできませんか?ソースを停止させることができるタイムアウト 'take()'オーバーロードがありますが、 'create'に' setDisposable'が必要です。 – akarnokd

+0

@akarnokd非同期コードは、AndroidのNetwork Service Discovery(https://developer.android.com/training/connect-devices-wirelessly/nsd.html#discover)です。リスナーが登録解除されるまで、ローカルネットワーク内のデバイスをスキャンします。 1回だけスキャンしたいので、手動で5秒後にリスナーの登録を解除してから、 'emitter.onComplete()'を呼び出す必要があります。 'take()'は完了してオブザーバブルを破棄しますか? –

+0

Javadocと図[take()](http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/Observable.html#take-long-java.util.concurrent)を見てください。 TimeUnit-)。 – akarnokd

答えて

1

を使用すると、指定した時間が経過するまでのソースからアイテムを持つことができますtakeの時限式過負荷が存在します。

関連する問題