【问题标题】:Best way to cancel asynctask取消异步任务的最佳方法
【发布时间】:2013-07-19 17:16:06
【问题描述】:

我最近遇到了一个问题,我从一个活动中调用了一个异步任务并返回了一些数据。我的 UI 会冻结,我收到 ANR。我似乎已经通过对我认为可能的两件事使用解决方案的组合来解决它,包括我正在实现的 asynctask 和 arraylist。

我在 asynctask 上有一个回调来异步加载数据。我猜想,虽然我很难弄清楚,在 onpostexecute 之后 asynctask 是否被保留?无论如何,我在 onpostexecute 中调用了 this.cancel()。

在阅读了一些内容之后,似乎 cancel() 函数安排了要取消的任务,并且在发出请求后它可能会持续存在。所以我必须问有没有更好的方法在你完成后取消异步任务?在大多数情况下 cancel() 就足够了吗?有没有办法在实现回调时完全避免调用 cancel()。

【问题讨论】:

  • 你在做什么(calling this.cancel() in onPostExecute())是多余的。一旦执行到达onPostExecute(),线程就会等待垃圾收集器。如果另一个AsyncTask 需要一个线程,这个线程可能会被回收。但你不应该担心它。这里的问题是:为什么你的AsyncTask 输入 UI?
  • @vikram 我很有可能错认为这是一个异步任务问题,它可能是我的 ArrayList。似乎安排 this.cancel 是多余的,但我不确定。在调用 onpostexecute 后,我不确定如何保留和绑定 UI。在调用 onpostexecute 之后,我的 UI ANR 才会发生。
  • 您可以发布另一个问题以获得有关 ANR 问题的帮助。
  • @vikram stackoverflow.com/questions/17735305/… 我通过将 asynctaks 更改为 return 和 arraylist> 并在 asynctask 中调用 this.cancel() 解决了这个问题

标签: java android android-asynctask


【解决方案1】:

我过去所做的是设置异步任务及其调用者可以看到的同步布尔值。当我想取消异步任务时,我将布尔值设置为 false(通常命名为活动)。在异步任务中,我在各个点检查标志,如果它是假的(意味着它已被取消),那么我就返回而不完成任务的其余部分。

没有看到您的具体情况,很难更具体。

希望对你有帮助, 迈克

【讨论】:

  • 您是否在为异步任务创建的回调中实现了同步布尔值?这听起来是个好主意,尤其是无需调用取消的退货条款。
  • 见this post 我昨天刚刚给试图取消任务的人举了一个例子。基本代码示例就在那里。
【解决方案2】:

如果您在doInBackground 中放置了只执行一次而不是循环的代码行,则在执行任务后无法取消它。但是如果您在其中有循环或其他定期运行的命令,您可以为您的任务使用 setCancel(true) 并在循环执行语句之前检查任务的isCanceled() 的值。

【讨论】:

    【解决方案3】:

    我也遇到过和你一样的问题

    检查this,关于取消异步任务

    另请阅读this 关于回调的信息。也许如果你覆盖onPostExecute(),你的生活会更轻松。

    【讨论】:

      【解决方案4】:

      如前所述,您需要使用布尔变量。但是不要自己实现,因为 Android 框架已经为您完成了。在调用者中使用 AsyncTask.cancel(),在 AsyncTask 中使用 isCancelled() 来发起取消请求。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多