【问题标题】:Retrofit2 + RxJava2 Global handling errorsRetrofit2 + RxJava2 全局处理错误
【发布时间】:2018-10-20 12:46:22
【问题描述】:

如何使用 retrofit2 和 rxjava2 检查网络连接以及服务器是否可用于所有请求?

我可以通过向我的服务器 url 发送请求来检查“服务器可用”,但我可以通过向 google.com 或另一个“好”网站发送请求来检查网络连接吗?

我有更多的 api 请求,例如以下之一:

compositeDisposable.add(RetrofitClient
            .getApi()
            .somemethod()
            .map(response -> {
                Data data = null;
                if (response.isSuccessful()) {
                    data = response.body();
                } else {
                    data = new Data();
                    data.setResponseCode(response.code())
                }
                return data;
            })
            .onErrorReturnItem(new Data())
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(this::checkResponse());

如何检查我为所有请求编写的这些错误,以免重复代码?谢谢。

【问题讨论】:

    标签: java android retrofit2 rx-java2


    【解决方案1】:

    在您的应用程序类的onCreate 中调用RxJavaPlugins.setErrorHandler。例如:

        RxJavaPlugins.setErrorHandler(e -> {
            if ((e instanceof IOException) || (e instanceof SocketException)) {
                // handle exception
                return;
            }
        });
    

    【讨论】:

    • 感谢您的回答,如果我有“.onErrorReturnItem()”或者我需要删除它并处理 subscribe() 中 onError 方法中的错误,它会起作用吗?
    【解决方案2】:

    您可以使用lift 方法,该方法允许您为您的案例实现自己的运算符ApiErrorOperator

    并按如下方式使用:

    @Override
      public @NonNull Observable<List<Category>> fetchCategories() {
        return this.service
          .categories()
          .lift(apiErrorOperator())
          .map(CategoriesEnvelope::categories)
          .subscribeOn(Schedulers.io());
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-09
      • 2016-12-28
      • 1970-01-01
      • 2019-07-13
      • 2017-01-20
      • 2015-08-04
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多