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

标签 java android multithreading android-asynctask

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

相关文章:

Java 在 jar 中使用代理设置

java - 使用 Java Swing 在选项卡式窗口中显示输出

java - Python 代码转换为 JVM

c++ - std::thread::detach 在原始调用者被销毁后导致崩溃

java - 如何正确使用来自 Actionlistener 事件的输入

c++ - 缓存的不可变值 : avoid lock

java - 使用 Hibernate 关系的 REST API 请求

java - 在 Java try block 中找不到符号

java - 将时间戳中的时间段 (AM/PM) 本地化为另一种语言

java - 我在这些类中使用 Bitmap 是否有效