即使网络出现故障,OkHttp请求也会继续运行

问题描述 投票:1回答:1

我使用OkHttp3作为我的客户端,我注意到了这种行为:每当我启动一个请求并且它仍在运行并且我关闭我的数据或互联网访问时,请求仍然继续运行并且不会停止(即不调用Callback)

我写了这样的代码:

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");
                }
            });

我怎么能阻止这个?

因为我希望它在网络出现故障时失败。

android networking okhttp3
1个回答
4
投票

您可以注册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();
}

// ...
© www.soinside.com 2019 - 2024. All rights reserved.