即使在onDestroy方法之后,AsyncTask也没有停止

时间:2018-02-07 14:52:32

标签: android

我有一点怀疑。我创建了一个asyncTask,在doInBackground中,我只是在for循环中打印数字(迭代100次)。在循环内部,我也将整数值存储在共享首选项中。我的问题是,当我按后退按钮时,我的异步任务没有退出。我还检查了onDestroy方法是否被调用。但仍然我的异步任务是打印数字并将计数存储在sharedPreferences中。

然后,如果异步任务在后台运行,即使您的应用程序被杀死,那么服务的用途是什么。因为服务也表现出相同的行为。

4 个答案:

答案 0 :(得分:0)

你肯定在doInBackGround方法中有一个循环,它不会被调用Asynctask#cancel取消。请参阅文档以及处理方法

  

可以通过调用cancel(boolean)随时取消任务。   调用此方法将导致后续调用isCancelled()   返回true。在调用此方法之后,改为onCancelled(Object)   之后将调用onPostExecute(Object)   doInBackground(Object [])返回。确保取消任务   你应该尽快检查返回值   如果可能的话,定期从doInBackground(Object [])获取isCancelled()   (例如在循环内部。)

Source

因此请定期检查您的循环isCancelled(),如果值为true则停止循环。

答案 1 :(得分:0)

ASyncTask与Service之间的区别,如本文Android: AsyncTask vs Service

中所述

AsyncTasks专为无法运行UI线程的一次性耗时任务而设计。一个常见的例子是在按下按钮时获取/处理数据。 服务旨在持续在后台运行。在上面按下按钮时获取数据的示例中,您可以启动服务,让它获取数据,然后停止它,但这是低效的。使用一次运行AsyncTask,返回数据并完成的速度要快得多。

异步任务在新线程上运行,每个应用程序都有一个UI(主)线程,您必须使用它来更新应用程序的UI,如果您正在主线程上做一些需要大量时间来完成您的工作可能会获得App Not Responding,因此您应该使用AsyncTask在单独的线程上执行所有时间和资源消耗工作。一旦启动,AsyncTask就不会被破坏,直到您从扩展AsyncTask的类实例化对象上显式调用cancel(),因此如果您的活动被破坏,AsyncTask将继续工作直到它完成它的工作。如果你想在活动被破坏时中断你的AsyncTask,你应该在活动'onDestroy()方法中调用cancel(boolean val),其中val如果为true将中断AsyncTask中的方法doInBackground(),否则如果false将让doInBackground()完成它的工作,在两种情况下,而不是调用onPostExecute将调用onCancelled()

答案 2 :(得分:0)

主要AsyncTask's的目的是启用一种简单的方法来处理线程和处理程序。它在将结果发布到UI线程时创建后台线程。观看此Google's Android Course AsyncTask课程以获取更多详细信息。

请注意一些问题,例如Asynctasks应该用于简短操作(如文档中所述)。

通过Google的课程,您将了解代码的实现情况。

答案 3 :(得分:-1)

雅。这有点困惑。 AsyncTask在不同的线程上运行。 首先,您需要一个全局变量来完成任务。

private myTask = new MyAsyncTask();

每当您需要取消任务时,只需致电myTask.cancel(true);

然后在您的asynctask中,您可以检查isCancelled()方法,如果您取消了任务,则返回true

F.e。

while (!isCancelled()) {

....
}

但最好使用RxJava来完成此类任务。它更容易取消等等。