如果出现错误,Rx-Java会替换Observable

时间:2018-02-09 10:45:37

标签: java android rx-java rx-android

我有2个网址来获取数据,例如:\location_1\{userid}\location_2\{userid}。对于第一个我得到用户列表,然后需要通过上述请求获取用户详细信息。问题是我需要调用\location_1\{userid}并且如果有错误(异常)从\location_2\{userid}获取数据。有可能用单个rx链制作吗?我按照here所述尝试try/catch,但看起来只接听onErrorResumeNext次呼叫。

Observable<List<TestModel2>> observable = apiTest
     .performTest()
     .flatMapIterable(items -> items)
     .flatMap(testModel -> {

        try
        {
            return apiTest.performTest2(testModel.userId);

        } catch (Exception e)
        {
            return apiTest.performTest3(testModel.userId);
        }

      }).doOnNext(testModel2 -> {Log.d("TestItemData", "doOnNext --- " + testModel2.title);})
            .onErrorResumeNext(throwable ->{
                            Log.d("TestItemData", "onErrorResumeNext -------- ");
                            return Observable.empty();
                         })
            .toList()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

1 个答案:

答案 0 :(得分:3)

使用onErrorResumeNext(正如您稍后在流程中所做的那样):

Observable<List<TestModel2>> observable = apiTest
.performTest()
.flatMapIterable(items -> items)
.flatMap(testModel -> 
    apiTest.performTest2(testModel.userId)
    .onErrorResumeNext(e -> apiTest.performTest3(testModel.userId)); // <----------------
)
.doOnNext(testModel2 -> {
    Log.d("TestItemData", "doOnNext --- " + testModel2.title);
})
.onErrorResumeNext(throwable ->{
    Log.d("TestItemData", "onErrorResumeNext -------- ");
    return Observable.empty();
})
.toList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());