OKHTTP3 SocketTimeOut仅适用于特定呼叫

时间:2017-09-06 15:56:54

标签: android okhttp okhttp3 kindle-fire okio

我有一个移动应用程序,可以对我们的REST API进行大约15次API调用。其中大多数是GET,POST,PUT并包含中小型JSON正文/响应。我们正在使用OKHTTP3 3.8.1。

我们对API Gateway-> Lambda进行了一次调用,其中包含稍大的JSON主体(小于500kb)。

API网关的一次调用失败得相当一致。但是,当我们在亚马逊Kindle Fire 7上进行测试时,它才会失败。该呼叫适用于Kindle Fire 8,以及我们测试过的所有其他Android手机/平板电脑。

我创建了另一个使用复制粘贴代码测试此调用的应用。在测试应用程序中,通话不会失败。但是,该应用程序未进行其他调用,并且未使用BLE或任何其他资源。

当呼叫失败时,服务器(API网关)根本不接收请求(Nothing is Logged)。所以我认为问题在于从平板电脑上获取数据。

这是我们在失败时获得的堆栈跟踪。

java.net.SocketTimeoutException
 at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)
 at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37)
 at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237)
 at okio.Okio$2.read(Okio.java:139)
 at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
 at okio.RealBufferedSource.indexOf(RealBufferedSource.java:345)
 at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:217)
 at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:211)
 at okhttp3.internal.http1.Http1Codec.readResponseHeaders(Http1Codec.java:189)
 at okhttp3.internal.http.CallServerInterceptor.intercept(CallServerInterceptor.java:75)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
 at com.company.app.helpers.http.HTTPHelpers$LoggingInterceptor.intercept(HTTPHelpers.java:202)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:45)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
 at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
 at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
 at com.company.app.helpers.http.HTTPHelpers$HeaderInterceptor.intercept(HTTPHelpers.java:225)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
 at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
 at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:185)
 at okhttp3.RealCall$AsyncCall.execute(RealCall.java:135)
 at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
 at java.lang.Thread.run(Thread.java:818)

如果有人对我们为什么会收到此错误以及可能是什么修复有任何想法,我将非常感谢任何建议!

编辑 - 我们已尝试增加超时,但通话仍未离开平板电脑。我们已确认通话不会使用代理离开平板电脑。

此外,似乎问题与HTTP同时使用BLE有关。

1 个答案:

答案 0 :(得分:0)

尝试在okhttp中增加超时

new OkHttpClient.Builder() .connectTimeout(90, TimeUnit.SECONDS).readTimeout(90, TimeUnit.SECONDS) .writeTimeout(90, TimeUnit.SECONDS).build();