Retrofit

时间:2017-05-23 22:13:49

标签: android retrofit rx-java

我在我的Android应用程序中使用RxJava适配器设置Retrofit。问题是我得到了一些报告,在某些设备中,Retrofit正在触发ConnectionException,而在其他一些设备中正在触发UnknownHostException。这很难使用rx.Observables方法插入其他onErrorResume()。更糟糕的是,两个异常共享的唯一共同父级是IOException,这是非常通用的。有一种方法可以统一这个吗?

我只处理UnknownHostException案件。但现在我也有了这个ConnectionException,谁知道其他设备中还有哪个例外。

我可以将这两个例外映射到通用自定义异常,例如NoInternetConnectionException。但是,还有更多这样的例外吗?

更新

目前我的Interactors / UseCases正在执行以下操作:

mNetworkUserRepository.getUserList()
    .onErrorResule(ObservableUtils.whenExceptionIs(RetrofitError.class), mUserDatabase.getUserList()) //Server side error
    .onErrorResule(ObservableUtils.whenExceptionIs(UnknownHostException.class), mUserDatabase.getUserList()) //No internet
    .onErrorResule(ObservableUtils.whenExceptionIs(ConnectionException.class), mUserDatabase.getUserList()) //ANOTHER EXCEPTION FOR THE SAME THING
    .subscribe(new MySubscriber<List<Users>>() {
        @Override
        public void onNext(List<Users> response) {
            callback.showOnUI(response);
        }
    });

所以基本上在三星S7中,UnkownHostException被触发,在另一个设备中,Nexus正在触发ConnectionException。我不喜欢这个,有多少其他&#34;没有互联网&#34;有例外吗?我想,如果我试图在没有互联网连接的情况下发出http请求,那么Retrofit只会触发UnknownHostException。我怎么组这个?我不想为不同的设备和东西附加N onResumeErrors

1 个答案:

答案 0 :(得分:0)

您实际上无法从异常中了解是否没有互联网,或者您遇到的其他一些网络错误,您可能会遇到许多其他情况和例外情况 SocketTimeoutExceptionUnknowHostException或从Exception派生的任何其他网络IOException(您可以看到来自IOException的数十个派生类),它可能会也可能不会与互联网无关,因为网络运营可能会在不同来源的很多阶段失败,尤其是在移动网络上时。

所以,我认为如果你真的需要'没有互联网'的行为,你应该在请求之前check it并采取不同的行动。

当您执行呼叫时,我认为有两种类型的失败需要考虑,IOException可能会发生任何网络错误。 (无论你的情况如何重试/使用缓存都不多),以及改装错误(HttpException),这意味着你得到了服务器的响应(没有网络错误)但是请求本身有问题(你可以有您可能采取行动的大量错误原因 - 身份验证错误(令牌),授权等。)