【问题标题】:How can I cancel an HTTP GET request called from an AsyncTask?如何取消从 AsyncTask 调用的 HTTP GET 请求?
【发布时间】:2013-01-15 03:13:12
【问题描述】:

我正在使用静态 Web 服务类来调用 HTTP GET 请求,并希望能够在用户按下后退按钮时取消请求/AsyncTask。

我在 doInBackground 中定期检查 isCancelled(),它适用于所有其他操作,但如果 HTTP 请求在用户回击时发生,则在收到结果或超时之前不会取消任务。

由于对 WebServices.getDeviceId() 的静态调用,我没有 HTTP 客户端的句柄,所以我不能使用 httpclient.getConnectionManager().shutdown();停止连接。有人对我如何解决这个问题有任何想法吗?

@Override
    protected Void doInBackground(Void... params) {
        if((mInstance.getDeviceId() == null) && !isCancelled()) {
            String deviceId = WebServices.getDeviceId();
        }

        return null;
    }

【问题讨论】:

  • 你写了I check isCancelled() periodically,但我认为你错了:你只检查了一次isCancelled(),在doInBackground()的开头。
  • 好吧,现在这是 doInBackground 中唯一要做的事情,所以我只检查一次,因为没有循环或任何东西,而且我无法在实际的 HTTP 内容中检查它
  • 是的,你是对的,我只是想检查一下你所说的“定期”是什么意思,因为没有循环。

标签: android http android-asynctask


【解决方案1】:

如果要中断http请求,需要引用它并调用yourHttpRequest.abort()

在WebServices类中,不能添加abortHttpRequest()之类的方法,并添加对当前HttpRequest的引用吗?

您可能需要管理一个 http 请求队列并中止正确的请求。

【讨论】:

  • 我想过,但是由于方法是静态访问的,我怎么知道哪个 HttpRequest 是当前的?
  • 如果你这样做,你需要管理一个 HttpRequests 队列,read this。您可能不再需要 AsyncTasks 并且您将拥有对排队请求的引用。
【解决方案2】:

这是来自 SDK:

 Cancelling a task

A task can be cancelled at any time by invoking cancel(boolean). 
Invoking this method will cause subsequent calls to isCancelled() 
to return true. 
After invoking this method, onCancelled(Object), instead of 
onPostExecute(Object) will be invoked after doInBackground(Object[]) returns. 
To ensure that a task is cancelled as quickly as possible, 
you should always check the return value of isCancelled() periodically from 
doInBackground(Object[]), if possible (inside a loop for instance.)

然后

if (isCancelled()) 
     break;
else
{
   // do your work here
}

this 就是这样的答案

【讨论】:

  • 是的,我已经这样做是为了取消 AsyncTask,但是如果在 HTTP 请求运行时调用取消,则在请求完成或超时之前,该任务不会被取消
  • 取消任务不会中断http请求
  • 你能做 httpclient.getConnectionManager().shutdown();在 onCancelled()
猜你喜欢
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2013-11-01
  • 2018-12-15
相关资源
最近更新 更多