我有一个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/