我使用OkHttp3作为我的客户端,我注意到了这种行为: 每当我启动一个请求并且它仍在运行并且我关闭我的数据或互联网访问时,请求仍然继续运行并且不会停止(即不调用回调)
我写了这样的代码:
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");
}
});
我该怎么办?
因为我希望它在网络出现故障时失败。
答案 0 :(得分:3)
您可以注册ConnectivityManager.CONNECTIVITY_ACTION
广播,这样您就可以在没有网络连接时收到通知并取消您的请求。
对于断开事件,设置布尔额外
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();
}
// ...