I would like to know how to ignore exceptions and continue infinite stream (in my case stream of locations)?
I'm fetching current user position (using Android-ReactiveLocation) and then sending them to my API (using Retrofit).
In my case, when exception occurs during network call (e.g. timeout) onError
method is invoked and stream stops itself. How to avoid it?
Activity:
private RestService mRestService;
private Subscription mSubscription;
private LocationRequest mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(100);
...
private void start() {
mRestService = ...;
ReactiveLocationProvider reactiveLocationProvider = new ReactiveLocationProvider(this);
mSubscription = reactiveLocationProvider.getUpdatedLocation(mLocationRequest)
.buffer(50)
.flatMap(locations -> mRestService.postLocations(locations)) // can throw exception
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
}
RestService:
public interface RestService {
@POST("/.../")
Observable<Response> postLocations(@Body List<Location> locations);
}
You may want to use one of the error handling operators.
onErrorResumeNext( )
— instructs an Observable to emit a sequence of items if it encounters an erroronErrorReturn( )
— instructs an Observable to emit a particular item when it encounters an erroronExceptionResumeNext( )
— instructs an Observable to continue emitting items after it encounters an exception (but not another variety of throwable)retry( )
— if a source Observable emits an error, resubscribe to it in the hopes that it will complete without errorretryWhen( )
— if a source Observable emits an error, pass that error to another Observable to determine whether to resubscribe to the sourceEspecialy retry
and onExceptionResumeNext
look promising in your case.