如何在调用新的asynctask时杀死先前的任务

时间:2012-03-27 08:33:51

标签: android listview android-asynctask

我正在使用asynctask从给定的url中获取图像。这些图像显示在listview中。问题是当我快速滚动列表视图时应用程序崩溃.logcat错误是

03-27 13:08:42.355: E/AndroidRuntime(25567): java.util.concurrent.RejectedExecutionException: pool=128/128, queue=10/10

从这个错误我开始知道这是并行运行许多asynctask线程的问题。为了解决这个问题,我编写了以下代码。

   NWTaskObj obj = new NWTaskObj();
            obj.setType(AdapterType.OfferAdapter);
            obj.setLink(offer.getImageLink());
            obj.setObject(this);
            if(count<10){
            new HandleOfferImage().execute(obj); 
            }else{
            new HandleOfferImage().cancel(true);
            new HandleOfferImage().execute(obj); 
            }

count 是一个静态变量。它在HandleOfferImage类中递增。但它仍然在同一个场景中崩溃。我需要杀死以前的asynctasks(如果count> 10),除了最后一个但是one.i不想在这里使用懒惰列表。任何人都可以帮助我吗?

6 个答案:

答案 0 :(得分:1)

new HandleOfferImage().cancel(true);

错了。将任务指针保存在像mask这样的变量中,然后

mTask.cancel(true);

更新:

if (mTask!= null) {
    mTask.cancel(true);
}

mTask= new TaskGetTeams();
mTask.execute();

答案 1 :(得分:0)

如果您有多个任务并想要取消所有任务,那么它非常简单。只需存储您在ArrayList中启动的所有异步任务。当您想要取消这些任务时,只需遍历此ArrayList并取消所有任务。简单。像:

HandleOfferImage myAsyncTask = new HandleOfferImage();
aList.add(myAsyncTask); //aList is you array list
myAsyncTask.execute(obj);

//When you want to cancel
for(HandleOfferImage task : aList) {
    task.cancel();
}

答案 2 :(得分:0)

维护应用程序类中的 isloggedin 之类的布尔变量。在 isloggedin 标志中,如果要启动任务,请执行以下操作,并将 isloggedin 标记为false想要停止任务。在你的任务中检查每个级别的 isloggedin 标记。如果你的 isloggedin 标记为ytrue,请执行你的任务,否则不执行任务并从任务。

答案 3 :(得分:0)

此外,你需要检查doBackground()是否取消了asynctask。

来自开发者网站。

  

取消任务

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

答案 4 :(得分:0)

取布尔变量。

boolean stopTask = false,isDoing = true;

假设这是您的AsyncTask

public class HandleOfferImage extends AsyncTask
{
      public void doInBackGround()
      {
           if(stopTask==false)
           {
               isDoing = true;
               // do your stuff
           }
           else
           {
               isDoing = false;
           }

      }
}

现在在你的代码中,

if(count<10){      
            stopTask = true; // stop task
            while(isDoing==true){} // wait to stop
            stopTask = false;
            new HandleOfferImage().execute(obj);       
            }else{      

            new HandleOfferImage().cancel(true);      
            stopTask = true;
            while(isDoing==true){} // wait to stop
            stopTask = false;

            new HandleOfferImage().execute(obj);       
            }      

这是我认为可以帮助你的,但我自己没有测试过这段代码。

答案 5 :(得分:0)

 if(count<maxConst){
                task=new HandleOfferImage();
                offerImageTask.add(task);
                task.execute(obj);
            }else{ 
                for(int nCount=0;nCount<offerImageTask.size()-2;nCount++){
                offerImageTask.get(nCount).cancel(true);
                offerImageTask.remove(nCount);

                }
                task=new HandleOfferImage();
                offerImageTask.add(task);
                task.execute(obj);
            } 

这里maxConst = 10和offerImageTask是HandleOfferImage类的arraylist。