我正在使用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不想在这里使用懒惰列表。任何人都可以帮助我吗?
答案 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。