2016-11-24 4 views
3

У меня есть приложение, состоящее из 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} 
+0

С какой сетью вы подключаетесь? Может ли это быть просто латентностью с сервера google? Попробуйте настроить сервер в локальной сети и запросить его при тестировании, чтобы у вас было время ответа, которое вы контролируете и будете постоянным, а затем повторите свои тесты и посмотрите, снова ли вы получите ту же проблему. –

+0

Спасибо, хорошая точка. Я не могу воспроизвести проблему с локальным сервером, но непоследовательность остается для удаленных серверов (а не просто Google в этом случае). Что меня больше смущает, так это то, что тайм-ауты, которые я установил, каким-то образом игнорируются. PS: ATM Я просто подключаюсь к домашней сети Wi-Fi. – localhorst

+0

Опубликуйте код, в котором вы установили политики повтора/тайм-аута –

ответ

4

Я только что проверил (путем добавления пользовательского разрешения DNS), что запросы блокируются из-за медленного DNS решения.

11-24 22:29:39.317 D/WifiReceiver: Lookup 172.217.22.78 
11-24 22:29:39.372 D/WifiReceiver: Request to URL: http://172.217.22.78/ 
11-24 22:29:39.425 D/WifiReceiver: Lookup www.google.com 
11-24 22:29:49.953 D/WifiReceiver: Request to URL: http://www.google.com/ 
11-24 22:29:50.291 D/WifiReceiver: Lookup www.google.de 
11-24 22:30:00.775 D/WifiReceiver: Request to URL: http://www.google.de/?gfe_rd=cr&ei=zVs3WLmoNdPLugTk8IKoCA 
11-24 22:30:01.197 D/WifiReceiver: Response{protocol=http/1.1, code=200, message=OK, url=http://www.google.de/?gfe_rd=cr&ei=zVs3WLmoNdPLugTk8IKoCA} 
+0

Рад, вы решили свою проблему. Не могли бы вы привести меня с некоторым кодом, как вы это поняли? –