2017-06-12 15 views
1

上に観察を実行改造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を(使用)条件付きで、さらに何をすべきかを決定するネットワークのチェックを追加することです:

答えて

1

は、ここに提案です。

2)delaySubscription()を使用して前に遅延を追加することはできますが、遅延も最初に発生するため、最後に遅延を追加するという2番目のアプローチがここではより適切であると思われますを使用してrepeatWhen()

+0

大変感謝します。ただし、アクティビティが破棄されたときにどのように退会できますか? – Rosenberg

+0

登録を解除するだけで、ループが停止します – yosriz

+0

@yosrizフラットマッピングで追加購読する必要がありますか?私はそれが不要だと思う。 –

関連する問題