如何在RxJava / RxAndroid中多次重复相同的网络请求(不同的参数)?

时间:2017-01-25 15:31:46

标签: java android rx-java

所以,我有一个/download API,它返回一个通用Object(基于索引号,这是它自己的参数)然后我必须将它保存到我的数据库,如果事务是成功之后,我必须增加索引并再次重复相同的过程,否则retry()

我需要重复约50次。

如何使用Rx-Java实现此过程? 我现在卡住了。任何帮助都是极好的。谢谢。

3 个答案:

答案 0 :(得分:5)

Observable.range(1, 50)
    .flatMap(index ->      // for every index make new request
        makeRequest(index) // this shall return Observable<Response>
            .retry(N)      // on error => retry this request N times
    )
    .subscribe(response -> saveToDb(response));

回答评论(仅在先前的响应保存到db后才发出新请求):

Observable.range(1, 50)
    .flatMap(index ->      // for every index make new request
        makeRequest(index) // this shall return Observable<Response>
            .retry(N)      // on error => retry this request N times
            .map(response -> saveToDb(response)), // save and report success
        1                  // limit concurrency to single request-save
    )
    .subscribe();

答案 1 :(得分:1)

如果我理解正确,这段代码应指向正确的方向。

        BehaviorSubject<Integer> indexes = BehaviorSubject.createDefault(0);
        indexes.flatMap(integer -> Observable.just(integer)) // download operation
               .flatMap(downloadedObject -> Observable.just(integer)) // save operation
               .doOnNext(ind -> indexes.onNext(ind + 1))
               .subscribe(ind -> System.out.println("Index " + ind));

会发生什么:

  1. BehaviorSubject是整个工作的一种发起者,它为索引提供信息 到了连锁店。
  2. 第一个flatMap是您进行下载操作的地方
  3. 将第二个flatMap保存到数据库
  4. 在doOnNext中你必须这样做 向主题发出onNext或onComplete以继续或完成 处理。 (这可以在订户中完成)
  5. 请记住在onNext中添加停止条件,以便最终无限循环。

答案 2 :(得分:0)

  

我需要重复这个约50次。

您可以使用range运算符并处理每个发出的Int。

  

如果交易成功,我必须增加我的索引

在这种情况下,您需要使用concatMap运算符。它按顺序处理每个Observable

Observable<Response> makeRequest(int i) {...}

Completable saveToDb(Response response) {...}

Observable.range(1, 50)
    .concatMap(i -> makeRequest(i)
                        //I assume that you save your response to DB asynchronously
                        //if not - use doOnNext operator instead of flatMapCompletable
                        .flatMapCompletable(response -> saveToDb(response)
                        .toObservable())
    .retry()
    ...