У меня есть приложение, состоящее из BroadcastReceiver
, которое вызвано изменениями сетевого подключения (в основном я просто хочу вызвать определенные URL-адреса при подключении к определенному SSID).Странная блокировка соединения/зависание с OkHttpClient
У меня есть странная проблема с зависанием запросов OkHttp. Иногда запрос обрабатывается сразу, иногда требуется 10 или 20 секунд. Я уже пытался установить таймауты для подключения, чтения и записи для используемого OkHttpClient безрезультатно. Запрос выдается после того, как телефон подключился к сети. Я также попытался запустить запрос в отдельном потоке с задержкой в 2 секунды, но это ничего не изменило.
EDIT: Я добавил сетевой перехватчик. Интересно, что даже первый запрос задерживается значительно большую часть времени. Однако, если я начну с 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();
BroadcastReceiver
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}
С какой сетью вы подключаетесь? Может ли это быть просто латентностью с сервера google? Попробуйте настроить сервер в локальной сети и запросить его при тестировании, чтобы у вас было время ответа, которое вы контролируете и будете постоянным, а затем повторите свои тесты и посмотрите, снова ли вы получите ту же проблему. –
Спасибо, хорошая точка. Я не могу воспроизвести проблему с локальным сервером, но непоследовательность остается для удаленных серверов (а не просто Google в этом случае). Что меня больше смущает, так это то, что тайм-ауты, которые я установил, каким-то образом игнорируются. PS: ATM Я просто подключаюсь к домашней сети Wi-Fi. – localhorst
Опубликуйте код, в котором вы установили политики повтора/тайм-аута –