【发布时间】:2017-04-09 04:38:36
【问题描述】:
我有一个包含BroadcastReceiver 的应用程序,它在网络连接更改时被调用(基本上我只想在连接到某个 SSID 时调用某些 URL)。
我在挂起 OkHttp 请求时遇到了一个奇怪的问题。有时请求会立即得到处理,有时需要 10 或 20 秒。我已经尝试为使用过的 OkHttpClient 设置连接、读取和写入超时,但无济于事。该请求在手机连接到网络后发出。我还尝试在单独的线程中触发请求,延迟 2 秒,但这并没有改变任何东西。
编辑:我添加了一个网络拦截器。有趣的是,即使是第一个请求,大多数时候也会显着延迟。但是,如果我从 IP 地址而不是 google.com 开始,第一个请求会立即在拦截器中弹出。是否存在可能的 DNS 问题?
OkHttpClient 设置
client = new OkHttpClient.Builder()
.writeTimeout(3, TimeUnit.SECONDS)
.readTimeout(3, TimeUnit.SECONDS)
.connectTimeout(3, TimeUnit.SECONDS)
.followRedirects(true)
.addNetworkInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.d(TAG, "Request to URL: " + request.url());
Response response = chain.proceed(request);
return response;
}
})
.build();
广播接收器
public void onReceive(Context context, Intent intent) {
/* ... */
client.newCall(new Request.Builder()
.url(url)
.build()).enqueue(/* logging callback with
Log.d(TAG, response.toString()); on success*/);
}
清单中的接收者
<receiver
android:name=".WifiReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.wifi.WIFI_STATE_CHANGED"/>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
Logcat结果,注意时差
11-24 22:19:49.717 17511 17511 I WifiReceiver: -- Wifi connected ---
11-24 22:19:49.796 D WifiReceiver: Request to URL: http://172.217.22.78/
11-24 22:20:00.300 D WifiReceiver: Request to URL: http://www.google.com/
11-24 22:20:11.363 D WifiReceiver: Request to URL: http://www.google.de/?gfe_rd=cr&ei=gFk3WL3CDdHnugSQ262QCA
11-24 22:20:11.750 17511 18242 D WifiReceiver: Response{protocol=http/1.1, code=200, message=OK, url=http://www.google.de/SQ262QCA}
【问题讨论】:
-
您连接的是哪种网络?它可能只是来自谷歌服务器的延迟吗?尝试在本地网络上设置一个服务器并在测试时向它发出请求,这样您就有一个可以控制的并且保持不变的响应时间,然后重试您的测试,看看您是否再次遇到同样的问题。
-
谢谢,好点子。我无法用本地服务器重现问题,但远程服务器仍然存在不一致(在这种情况下不仅仅是谷歌)。最让我困惑的是,我设置的超时以某种方式被忽略了。 PS:ATM我只是连接到我家的wifi网络。
-
发布设置重试/超时策略的代码
-
我已经添加了客户端构建代码。
-
您是否还覆盖了
Call的onFailure()回调?您是否尝试在客户端构建器上设置retryOnConnectionFailure(false)。默认情况下,连接会在某些情况下重试