2016-08-11 2 views
1

Я использую OkHttp3 как мой клиент, и я заметил это поведение: Всякий раз, когда я начала Request и он все еще работает, и я от моих данных или доступ в Интернет Request все еще продолжает работать и не останавливается (т.е. нет Callback называется)OkHttp Запрос продолжает работать, даже если сеть не удается

я написал такой код:

final OkHttpClient client = new OkHttpClient.Builder() 
      .connectTimeout(10, TimeUnit.SECONDS) 
      .writeTimeout(10, TimeUnit.SECONDS) 
      .readTimeout(30, TimeUnit.SECONDS) 
      .build(); 

Request req = new Request.Builder() 
       .url("<url>") 
       .build(); 

client.newCall(req).enqueue(new Callback() { 
       @Override 
       public void onFailure(Call call, IOException e) { 
        Log.d(TAG, "Failed"); 
       } 

       @Override 
       public void onResponse(Call call, okhttp3.Response response) throws IOException { 
        Log.d(TAG, "Response"); 
       } 
      }); 

Как я могу остановить это?

Потому что я не сбой при сбое сети.

ответ

2

Вы можете зарегистрироваться на трансляцию ConnectivityManager.CONNECTIVITY_ACTION, чтобы вы могли получать уведомления, когда нет сетевого подключения и отменить ваши запросы.

От его documentation:

Для события отключения, булево дополнительный EXTRA_NO_CONNECTIVITY устанавливается в true, если нет подключенных сетей на всех.

Например, в вашем Activity вы могли бы сделать что-то вроде этого:

// ... 

private OkHttpClient client; 

private final BroadcastReceiver networkChangeReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     if(intent.getBooleanExtra(
       ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) { 

      // no network connection 
      if(client != null && client.dispatcher() != null) { 
       client.dispatcher().cancelAll(); 
      } 
     } 
    } 
}; 

// ... 

@Override 
protected void onResume() { 
    super.onResume(); 
    registerReceiver(networkChangeReceiver, 
     new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION)); 
} 

@Override 
protected void onPause() { 
    unregisterReceiver(networkChangeReceiver); 
    super.onPause(); 
} 

// ...