2013-02-06 34 views
0

我想取消特定条件下的异步任务。 我做了以下的东西:AsyncTask进入等待状态

MyService.java 

.... 
if(condition){ 

asyncTask.cancel(true); // its return the true as well 

} 
... 

MyAsynTask.java 

... 

protected Object doInBackground(Object... x) { 
    while (/* condition */) { 
     // work... 
     if (isCancelled()){ // Here task goes in to wait state 
break; 
    } 
     else{ 
//continue to download file 

    } 


    } 
    return null; 
} 
... 

使用DDMS我发现,任务进入等待状态。任何建议来解决这个问题将不胜感激。 Threads

谢谢, Yuvi

+1

你不需要检查它isCancelled()在doInBackground(方法)。只需检查条件n取消它。 –

+0

任务去?也许线程去? DDMS显示任务状态?如果线程进入等待状态,这是正常的。 – Leonidos

+0

@Leonidos添加屏幕截图以及... AsyncTask是只有线程的名称... – Yuvi

回答

1

的AsyncTask为PoolExecutor一件工作。当你执行你的第一个任务Executor创建第一个线程并在其上执行你的任务。任务执行完成后,线程不会被删除。它开始等待新的任务。

因此,看到AsyncTask线程处于等待状态是正常的。

P.S.最好不要使用AsyncTask进行长时间操作。使用你自己的执行者或线程。

P.P.S. AsyncTask自4.x开始使用单线程执行程序。小心)

+0

是的,异步任务默认顺序工作,我们也可以并行运行。但是,如果任务完成,它应该出现'onPostExecute'方法。 – Yuvi

+0

任何时候都可以通过调用cancel(boolean)来取消任务。调用此方法将导致对isCancelled()的后续调用返回true。调用此方法后,onCancelled(Object)将在doInBackground(Object [])返回后调用,而不是onPostExecute(Object)。为确保尽快取消任务,如果可能(例如在循环内),应始终从doInBackground(Object [])中定期检查isCancelled()的返回值。 – Leonidos

+0

如果取消任务onPostExecute won'不要叫。 – Leonidos

0

在您明确调用asyncTask.cancel(true);后,将调用onCancelled()方法。尝试覆盖下面的方法:

@Override 
protected void onCancelled() { 
    //what you want to do when the task was cancelled. 
} 
+0

你永远不知道什么时候会调用onCaneclled,它总是更好的想法来检查'doInBackground'方法中的isCancelled()。 – Yuvi