上に観察を実行改造RxJava2 - 繰り返し作業のインターバル&条件
で実行これは私のインターフェイスです:
@GET("solicitation/all")
Observable<SolicitationResponse> getAll(@Query("X-Authorization") String apiKey);
私はそれを実行する場所です:
apiService.getAll(getResources().getString(R.string.api_key))
.subscribeOn(Schedulers.io())
.flatMapIterable(SolicitationResponse::getData)
.observeOn(AndroidSchedulers.mainThread())
.delay(5L, java.util.concurrent.TimeUnit.SECONDS) // THIS DOESN'T WORK LIKE I WANT IT TO..
.repeat()
.subscribe(s -> Log.e(TAG, "data: " + s.getName()));
したがって、2つの質問:
1)インターネットに接続している場合にのみ条件を追加するにはどうすればよいですか?
これは動作しません:
if (NetworkUtils.isConnected()) {
//observable above here
}
なぜ?条件コードは無限に実行されるわけではないので、一度だけインターネットに接続しているかどうかをチェックします。つまり、失うとクラッシュします。
getAllメソッドを実行する前に条件を追加する方法はありますか?
2)私は.delay
を挿入して、それは私が欲しいか、必要なものではないサブスクリプションを、遅らせるだろう、タスクの前または後に間隔を追加する必要があります。この特定の状況ではどうすれば達成できますか?
Observable.fromCallable(() -> NetworkUtils.isConnected())
.flatMap(isConnected -> {
if (isConnected) {
return apiService.getAll(getResources().getString(R.string.api_key))
.subscribeOn(Schedulers.io())
.flatMapIterable(SolicitationResponse::getData);
} else {
return Observable.empty();
}
})
.subscribeOn(Schedulers.io())
.observeOn(Schedulers.immediate())
.repeatWhen(observable -> observable.delay(5, TimeUnit.SECONDS))
.subscribe(s -> Log.e(TAG, "data: " + s.getName()));
1)最も簡単な方法は、ストリームとflatMapを(使用)条件付きで、さらに何をすべきかを決定するネットワークのチェックを追加することです:
大変感謝します。ただし、アクティビティが破棄されたときにどのように退会できますか? – Rosenberg
登録を解除するだけで、ループが停止します – yosriz
@yosrizフラットマッピングで追加購読する必要がありますか?私はそれが不要だと思う。 –