我有以下设置:
final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(5, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(5, TimeUnit.SECONDS);
RestAdapter.Builder builder = new RestAdapter.Builder()
.setEndpoint(ROOT)
.setClient(new OkClient(okHttpClient))
.setLogLevel(RestAdapter.LogLevel.FULL);
我正在尝试处理我的服务器停机并且用户收到连接超时异常的情况,这是我的日志记录:
java.net.SocketTimeoutException: failed to connect to /192.168.0.53 (port 3000) after 5000ms
完整日志记录:http://pastebin.com/gscCGb7x
有没有办法把它转到改造故障方法中,这样我就可以在那里处理它了?
8条答案
按热度按时间o0lyfsai1#
**用于 Retrofit 2 **
在Web服务示例中定义监听程序:
将拦截器添加到Web服务:
用try-catch块封装拦截代码,并在异常发生时通知侦听器:
af7jpaap2#
6yjfywim3#
如果有人带着Kotlin/Coroutines来到这里,面临同样的问题,请在您的协程作用域中添加一个错误处理程序:
而处理程序本身看起来像:
ulydmbyx4#
没有一个答案对我很有效,但它们把我引向了正确的方向。请看下面我在Kotlin是如何做到的。
您可以在
ErrorInterceptor
中抛出异常,然后在api调用函数中捕获它们:或者将异常与响应对象捆绑在一起;就像这样:
将
ErrorInterceptor
添加到您的okHttpClient
:然后在存储库层中显示如下内容:
oxiaedzo5#
显然,异常确实被 Package 到RetrofitException中,以便您可以在失败方法中处理它。
fdbelqdn6#
这有点复杂,使用Retrofit你可以进行同步或异步的API调用。
如果你的端点返回void并且有回调,那么它是异步的;如果它返回了一些东西并且没有回调,那么它是同步的。
对于异步调用,在回调的
onFailure(...)
方法中会出现此异常。对于同步调用,除非您将调用 Package 在try/catch中,否则您根本无法获得它。
gzszwxb47#
我发布这个有两个原因:
1.我个人尝试过增加连接超时,但是,事实上,它并没有真正从根本上解决问题。此外,根据this post,用户不应该等待超过10秒。
1.在真实的应用程序中,我们宁愿尽最大努力以尽可能干净的方式实现解决方案。
这是我在Kotlin中提出的一个解决方案,它的灵感来自于@Olcay Ertaš提供的the answer,并结合了Google's recommended architecture用于Android应用程序。
1.创建
TimeoutInterceptor
接口:1.实现
TimeoutInterceptor
接口:1.在
ApiService
界面中,将TimeoutInterceptor
添加到OkHttpClient
构建器:你可能已经注意到了,你可以设置一个自定义的连接超时,否则,根据documentation,它会被设置为10秒的默认值。
1.创建一个枚举类
ConnectionState
,它将提供一个枚举常量对象CONNECTION_TIMEOUT
,该对象将进一步用于将适当的连接(或API调用)状态从EntityNetworkDataSource
类传递到View类(如果您遵循Google的MVVM模式):1.假设您的
EntityNetworkDataSource
接口如下所示:1.在
EntityNetworkDataSource
实现类中,您可以在fetchEntity(id: Int)
实现中正确捕获SocketTimeoutException
,如下所示:同样的原则也适用于您想要拦截和捕获的任何连接异常。
fcipmucu8#
Kotlin
如果要在
Kotlin
中使用Retrofit
,请执行以下步骤:定义Retrofit界面:
实施您的服务:
在您需要的位置呼叫您的服务:
您可以在
runAsync
函数中处理任何您想要的异常。您可以获得完整的工作示例here。