首次执行后如何停止排队的呼叫?

时间:2019-04-02 10:14:18

标签: android okhttp3 enqueue

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

    });
}

2 个答案:

答案 0 :(得分:0)

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

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(),请求将停止。

答案 1 :(得分:0)

每次更改配置(例如旋转手机/仿真器)时,都会调用

onCreate。有关更多信息:https://developer.android.com/guide/components/activities/activity-lifecycle

您可以保存响应,以防止在每个onCreate上发出新请求。像这样:

MainActivity {
  private Response savedResponse;

  onCreate() {
    if (savedResponse == null) {
      Load(url)
    }
  }
}

,然后在您的onResponse中保存响应:

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

但是,正确的方法是将网络调用/请求与活动生命周期分开,并将数据加载到其他位置(服务,WorkManager等)