第一次执行后如何停止排队?

问题描述 投票:0回答:2

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

    });
}
android okhttp3 enqueue
2个回答
0
投票

改造支持排队取消,它很有效。我想如果您尝试运行此代码 - 您的客户端队列将被停止

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秒,则调用qazxsw poi并且请求正在停止。


0
投票

每次配置更改时都会调用onCreate(例如,您可以旋转手机/模拟器)。欲了解更多信息:call.cancel()

您可以保存响应以防止每个onCreate上的新请求。像这样的东西:

https://developer.android.com/guide/components/activities/activity-lifecycle

并在您的onResponse中保存响应:

MainActivity {
  private Response savedResponse;

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

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

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