как убить предыдущие задачи при вызове новой асинхронной задачи - PullRequest
3 голосов
/ 27 марта 2012

Я использую 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 является статической переменной.It увеличивается в классе HandleOfferImage.но все равно он падает в том же сценарии. мне нужно убить предыдущие асинхронные задачи (если число> 10), кроме последнего, но один. я не хочу использовать ленивый список здесь. кто-нибудь может мне помочь?

Ответы [ 6 ]

1 голос
/ 27 марта 2012
new HandleOfferImage().cancel(true);

неправильно. удерживайте указатель задачи в переменной, такой как mTask, а затем

mTask.cancel(true);

UPDATE:

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

mTask= new TaskGetTeams();
mTask.execute();
0 голосов
/ 27 марта 2012
 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.

0 голосов
/ 27 марта 2012

Принимая булеву переменную.

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

Это то, что япредположим, может помочь вам, но я сам не проверял этот код.

0 голосов
/ 27 марта 2012

Кроме того, вам нужно проверить в doBackground (), отменена ли асинхронная задача или нет.

С сайта разработчика.

Отмена задачи

Задание можно отменить в любое время, вызвав отмену (булево).Вызов этого метода приведет к тому, что последующие вызовы isCancelled () вернут true.После вызова этого метода onCancelled (Object) вместо onPostExecute (Object) будет вызываться после возврата doInBackground (Object []).Чтобы задача была отменена как можно быстрее, всегда следует периодически проверять возвращаемое значение isCancelled () из doInBackground (Object []), если это возможно (например, внутри цикла.)

0 голосов
/ 27 марта 2012

Поддерживать логическую переменную, такую ​​как isloggedin в классе приложения. Укажите флаг isloggedin , где вы хотите запустить задачу, и false isloggedin флаг, где вы хотите остановитьсяЗадача. Проверьте этот isloggedin флажок каждый уровень в вашей задаче. Выполните вашу задачу, если ваш isloggedin помечает только как истинный, в противном случае не выполняйте свою задачу и выходите из задачи.

0 голосов
/ 27 марта 2012

Если у вас более одной задачи и вы хотите отменить все задачи, это очень просто.Просто сохраните все асинхронные задачи, которые вы запускаете в 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...