我最近遇到了一个问题,我从一个活动中调用了一个asynctask并返回了一些数据。我的用户界面会冻结,我得到一个ANR。我似乎已经通过使用我认为可能的两种解决方案的组合来解决它,asynctask和我正在实现的arraylist。
我在asynctask上有一个回调来异步加载数据。我猜想,虽然我很难搞清楚,但在onpostexecute之后,asynctask仍被保留了?无论如何,我在onpostexecute中调用了this.cancel()。
在读了一下之后,似乎cancel()函数会调度要取消的任务,并且在发出请求后它可能会持续存在。所以我必须问一下,在完成后取消asynctask是否有更好的方法?在大多数情况下取消()是否足够?有没有办法避免在实现回调时根本不必调用cancel()。
答案 0 :(得分:0)
我过去所做的是设置异步任务及其调用者可以看到的同步布尔值。当我想取消异步任务时,我将布尔值设置为false(通常命名为active)。在异步任务中,我在各个点检查标志,如果它永远是假的(意味着它已被取消),那么我只是返回而没有完成任务的其余部分。
如果不了解您的具体情况,很难更具体。
希望它有所帮助, 麦克
答案 1 :(得分:0)
如果你在doInBackground
中放置一段只执行一次而不是循环的代码,那么在执行任务后就无法取消它。但是如果你有循环或其他定期运行的命令,您可以使用setCancel(true)执行任务,并在循环执行语句之前检查任务的isCanceled()
值。
答案 2 :(得分:0)
答案 3 :(得分:0)
使用布尔变量是您需要做的事情。但是不要自己实现,因为Android框架已经为你做了这个。在调用者和AsyncTask中使用AsyncTask.cancel()
使用isCancelled()
来取消请求。