【问题标题】:Rx-Java centralized error handlingRx-Java 集中式错误处理
【发布时间】:2016-03-05 03:35:00
【问题描述】:

我使用 Retrofit 作为 Rx-Java 的网络库。我想对大多数请求进行一些集中式错误检查并处理错误,或者如果我无法处理它,则将其传递给订阅者的onError()。我怎么能这样做?

类似的东西

 projectListObservable
    .subscribeOn(Schedulers.newThread())
    .timeout(App.NETWORK_TIMEOUT_SEC, TimeUnit.SECONDS)
    .retry(App.NETWORK_RETRY_COUNT)
    .onError(e -> {
     if (e instanseOf HttpError && ((HttpError)e).getCode == 403){
        App.getInstance.getNetworkManager.reAuth();
     } else {
        throw(e);
     }})
   .observeOn(AndroidSchedulers.mainThread())
   .subscribe(new ProjectListSubscriber());

另外,在这种情况下我应该停止重试,但如果是网络问题,请继续重试 (instanceof IOException)。

【问题讨论】:

标签: android retrofit reactive-programming rx-java rx-android


【解决方案1】:

我认为你想用一个 observable 实现太多的 tihng。

你可以有一些HttpErrorHandler,它会有方法

boolean fix(Exception e) 

如果错误处理程序修复了异常(更新令牌等),则返回 true。您可以针对不同情况使用不同的错误处理程序,也可以针对所有情况使用不同的错误处理程序。 TokenErrorHandler RetryErrorHandler 然后做一个链。

如果所有错误处理函数都返回 false,则将此异常向上层抛出

【讨论】:

  • 如何将此 HttpErrorHandler 与 Rx 集成? rx 是否理解如果 fix 返回 true - 它应该重试 observable(再发送一个请求),如果 false - 调用下一个处理程序的 fix 方法或订阅者的 onError?
  • 我认为你可以使用 onErrorResumeNext() 来返回新的 observable,带有 for 循环和 handler.fix() 调用
  • @user1306579 看起来可以帮助我解决问题。您能否发布一个答案,展示一种在改造调用到达 onNext onError 方法之前链接错误处理程序的方法?
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 2016-03-03
  • 1970-01-01
  • 2018-12-27
  • 2016-12-20
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多