【问题标题】:how to kill previous tasks when a new asynctask is called调用新的异步任务时如何杀死以前的任务
【发布时间】:2012-03-27 08:33:51
【问题描述】:

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

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

从这个错误中我知道这是并行运行许多异步任务线程的问题。为了解决这个问题,我编写了以下代码。

   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),除了最后一个.我不想在这里使用惰性列表。有人可以帮我吗?

【问题讨论】:

    标签: android listview android-asynctask


    【解决方案1】:
    new HandleOfferImage().cancel(true);
    

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

    mTask.cancel(true);
    

    更新:

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

    【讨论】:

      【解决方案2】:

      如果您有多个任务并想取消所有任务,这非常简单。只需将您开始的所有异步任务存储在 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();
      }
      

      【讨论】:

      • 我不想取消所有异步任务。我想取消除当前和最后一个以外的异步任务。
      • 我已经对您的答案进行了一些更改,并且工作正常。将答案发布在这里。
      【解决方案3】:

      在应用程序类中维护布尔变量,如 isloggedin。将要启动任务的 isloggedin 标志设为真,将要启动任务的 isloggedin 标志设为假想要停止任务。检查任务中每个级别的 isloggedin 标志。如果您的 isloggedin 标志为 ytrue,则执行您的任务,否则不要执行您的任务并退出任务。

      【讨论】:

        【解决方案4】:

        另外,你需要在doBackground()中检查异步任务是否被取消。

        来自开发者网站。

        取消任务

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

        【讨论】:

          【解决方案5】:

          采用布尔变量。

          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);       
                      }      
          

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

          【讨论】:

            【解决方案6】:
             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 类类型的数组列表。

            【讨论】:

              猜你喜欢
              • 2013-05-29
              • 2019-05-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2019-01-13
              • 2019-08-24
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多