gpt4 book ai didi

java - android中调用AsyncTask.cancel(true)时AsyncTask不会立即调用 `onCancelled`

转载 作者:行者123 更新时间:2023-12-01 09:41:37 24 4
gpt4 key购买 nike

我有一个AsyncTask它调用 Web 服务并从中获取 json 对象。我想为此任务设置一个超时,以便如果出现任何问题(例如互联网连接断开等),AsyncTask 就会被取消。这是到目前为止我的代码:

@Override
protected void onStart() {
final GetRequestsTask requestTask = new GetRequestsTask();
requestTask.execute(createUrl());
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
Log.d("myapp", "entered handler");
if (requestTask.getStatus() == AsyncTask.Status.RUNNING) {
Log.d("myapp", "entered cancelling");
requestTask.cancel(true);
}
}
}, TIME_OUT);
}

问题是当 handler到达“进入取消”点并将取消信号发送到 AsyncTask ,它不会取消并调用 onCancelled()立即(如果有的话,它将在 10 秒左右后调用)

我的GetRequestTask是线性的,这意味着它内部没有循环,所以我无法检查 isCancelled()手动在 doInBackground() 内方法。

你建议我做什么?

最佳答案

来自this question :

如果您正在进行计算:

  • 您必须定期检查 isCancelled()。

如果您正在执行 HTTP 请求:

  • 将 HttpGet 或 HttpPost 实例保存在某处(例如公共(public)字段)。
  • 调用cancel后,调用request.abort()。这将导致 IOException 被抛出到 doInBackground 中。

另外如果你使用一些库来提供方便的请求,那么我认为它应该有一些cance()方法。例如,对于 retrofit there is such method.

因此,在这种情况下,就像“如果您正在执行 HTTP 请求”部分一样。你需要:

  • 保存您的请求实例(为了改进它的调用)
  • 调用取消后,为保存的请求实例调用“取消”方法。

另一种选择是 rxJava。借助该库,您可以根据您的请求创建 Observable 并保存对其订阅的引用。然后你只需要调用savedSubscription.unsibscribe()就可以了。

关于java - android中调用AsyncTask.cancel(true)时AsyncTask不会立即调用 `onCancelled`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38409993/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com