Siarhei
Siarhei

Reputation: 2436

Rx-Java replace Observable in case of error

I have 2 URLs to fetch the data, for example: \location_1\{userid} and \location_2\{userid}. for the first i get the list of the users and then need to fetch user details by above requests. the issue is that i need to call the \location_1\{userid} and in case there is an error(exception) fetch the data from \location_2\{userid}. is it possible to make it with single rx-chain? i've tried try/catch as described here but looks catch newer calls, only onErrorResumeNext calls.

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());

Upvotes: 0

Views: 398

Answers (1)

akarnokd
akarnokd

Reputation: 69997

Use onErrorResumeNext (as you already did a bit later in the flow):

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());

Upvotes: 3

Related Questions