1

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

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

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

4

4 回答 4

0

我和你有类似的问题

检查这个,关于取消异步任务

另请阅读有关回调的内容。也许如果你覆盖onPostExecute()你可以在你的生活中更轻松地做一些事情。

于 2013-07-19T17:28:13.963 回答
0

正如已经建议的那样,使用布尔变量是您需要做的。但是不要自己实现它,因为 Android 框架已经为你做了。AsyncTask.cancel()在您的调用者和 AsyncTask 中使用以isCancelled()获取取消请求。

于 2013-07-19T18:44:46.357 回答
0

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

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

希望它有帮助,迈克

于 2013-07-19T17:22:02.400 回答
0

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

于 2013-07-19T17:22:07.190 回答