как убить асинхронную задачу, если задача не видна? - PullRequest
0 голосов
/ 27 марта 2012

Я отображаю изображения в списке в моем приложении. Выбор изображений из заданного URL выполняется с помощью asynctask .Если я быстро прокручиваю свой список просмотра тогда мое приложение падает, потому что многие потоки асинхронной работы работают параллельно (каждое изображение вызывает асинктаску). Так что мне нужно cancell / kill потоки, которые вне поля зрения . Это означает только 2-3 асинхронных потока могут работать параллельно (мой список может отображать только 2-3 элемента одновременно). Кто-нибудь может мне помочь?

Ответы [ 4 ]

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

Я нашел решение для этой проблемы. Я добавляю все асинктивные действия в arraylist.кроме последних 2-3 асинхронных задач, я убиваю все элементы в этом arraylist.code указан ниже.

if(count<maxConst){
                task=new HandleOfferImage();
                offerImageTask.add(task);
                task.execute(obj);
                count++;
            }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);
                count++;
            } 
0 голосов
/ 27 марта 2012

Какой сценарий вы говорите, вы должны использовать LazyLoading на вашем ListView, и мне кажется, OutOfMemory Ошибка, потому что слишком быстрая прокрутка приводит к слишком быстрому декодированию растровых изображений, прежде чем сборщик мусора может взять ваше облаченное Bitmap

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

Мне кажется, это не проблема AssynchTask, это в основном MemoryIssue, если вы декодируете свое растровое изображение, используя метод Factory, используйте это

public Bitmap decode(String file, int quality) {
    BitmapFactory.Options o2 = null;
    try {

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(file, o);

        final int REQUIRED_WIDTH = 240;
        final int REQUIRED_HEIGHT = 280;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;

        int scale = quality;

        scale = quality;
        while (true) {
            if (width_tmp / 2 < REQUIRED_WIDTH
                    || height_tmp / 2 < REQUIRED_HEIGHT)
                break;
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }
        o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
    } catch (Exception e) {
        Log.i("Decodeing error2", "" + e.getMessage());

    }
    try {
        return BitmapFactory.decodeFile(file, o2);
    } catch (Exception e) {
        Log.i("Decodeing error1", "" + e.getMessage());
        return null;
    }

в качестве дают 4 или 5 в файле, вы можете заменить его на InputStream, а также вам нужно изменить еще немного кода, чтобы сделать его пригодным для использования в вашей программе

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

Одним из способов является то, что вы можете буферизовать все изображения, которые будут отображаться в виде списка, а затем отображаться. Это также улучшит производительность вашего списка, так как всякий раз, когда вы прокручиваете свой список, он загружает изображение из сети, что является громоздким. При этом вам также не придется беспокоиться о том, что вы убили асинхронные задачи для компонентов вне поля зрения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...