首页 > 解决方案 > 第一次执行后如何停止排队的调用?

问题描述

我对android开发很陌生。尝试连接某个站点并从中获取数据。我在主要活动中仅从 onCreate 调用此函数。每次我向左或向右转动虚拟 Android 手机时,我都会在 EditText 中看到新的“run()”字符串,并在 Wireshark 中看到请求。如何正确阻止它?

在 OnResponse 中尝试了 call.cancel() 和 mClient.dispatcher().cancelAll()

protected void Load(String url) {
    Request request = new Request.Builder()
            .url(url)
            .build();

    mClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
            e.printStackTrace();
        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException {
            if (response.isSuccessful()) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mEdit.setText(mEdit.getText() + "run()\n");
                    }
                });
            }
        }

    });
}

标签: androidokhttp3enqueue

解决方案


改造支持取消排队,效果很好。而且我认为如果您尝试运行此代码-您的客户端排队将被停止

protected void Load(String url) {
    Request request = new Request.Builder()
            .url(url)
            .build();

    Call<Response> mCall = mClient.newCall(request).enqueue(new Callback() {
        @Override
        public void onFailure(Call call, IOException e) {
                if (call.isCanceled()) {
                    Log.e(TAG, "request was cancelled");
                }
                else {
                    Log.e(TAG, "other larger issue, i.e. no network connection?");
                }
        }

        @Override
        public void onResponse(Call call, final Response response) throws IOException {
            if (response.isSuccessful()) {
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mEdit.setText(mEdit.getText() + "run()\n");
                    }
                });
            }
        }

    });

    mCall.cancel();
}

我不知道你的项目结构和你使用什么样的模式(MVP、MVVM 或其他),但简单来说,这段代码可以通过返回 Call 来改进

protected void Load(String url): Call<Response>

然后您可以处理您的请求状态,例如,如果超过 5 秒,您调用call.cancel()并且请求正在停止。


推荐阅读