如何忽略错误并继续无限流?

61

我想知道如何忽略异常并继续无限流(在我的情况下,是位置流)?

我正在获取当前用户位置(使用Android-ReactiveLocation),然后将其发送到我的API(使用Retrofit)。

在我的情况下,当网络调用期间发生异常(例如超时),会调用onError方法并停止流。该如何避免这种情况发生?

活动:

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

请参考以下类似的答案,其中包括点击事件异常处理:http://stackoverflow.com/questions/26154236/how-to-subscribe-to-click-events-so-exceptions-dont-unsubscribe/26229584#26229584 - Kirill Boyarshinov
这个编程问题的设置有点过于复杂了。你本可以用几行代码来简化它,无需考虑特定项目语义。 - Martin Andersson
11个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0
这是我的 Kotlin 扩展函数,用于忽略错误。
fun <T> Observable<T>.ignoreErrors(errorHandler: (Throwable) -> Unit) =
    retryWhen { errors ->
        errors
            .doOnNext { errorHandler(it) }
            .map { 0 }
    }

这个使用retryWhen来无限期地重新订阅上游,同时仍然允许您以非终端方式处理错误的方法。

这感觉很危险


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,