Существует ли Android AsyncTaskQueue или подобное? - PullRequest
1 голос
/ 12 июня 2010

Я где-то читал (и заметил), что запуск потоков идет медленно.Я всегда предполагал, что AsyncTask создал и повторно использовал один поток, потому что он требовал запуска внутри потока пользовательского интерфейса.

Следующий (анонимный) код вызывается из метода getView ListAdapter для асинхронной загрузки изображений.Он работает хорошо, пока пользователь не перемещает список быстро, а затем он становится " janky ".

final File imageFile = new File(getCacheDir().getPath() + "/img/" + p.image);
image.setVisibility(View.GONE);
view.findViewById(R.id.imageLoading).setVisibility(View.VISIBLE);
(new AsyncTask<Void, Void, Bitmap>() {
    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
            Bitmap image;
            if (!imageFile.exists() || imageFile.length() == 0) {
                image = BitmapFactory.decodeStream(new URL(
                        "http://example.com/images/"
                                + p.image).openStream());
                image.compress(Bitmap.CompressFormat.JPEG, 85,
                        new FileOutputStream(imageFile));
                image.recycle();
            }
            image = BitmapFactory.decodeFile(imageFile.getPath(),
                bitmapOptions);
            return image;
        } catch (MalformedURLException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
            return null;
        } catch (IOException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
            return null;
        }
    }

    @Override
    protected void onPostExecute(Bitmap image) {
        if (view.getTag() != p) // The view was recycled.
            return;
            view.findViewById(R.id.imageLoading).setVisibility(
                View.GONE);
        view.findViewById(R.id.image)
                .setVisibility(View.VISIBLE);
        ((ImageView) view.findViewById(R.id.image))
                .setImageBitmap(image);
    }
}).execute();

Я думаю, что метод на основе очереди будет работать лучше, но ямне интересно, есть ли один или я должен попытаться создать свою собственную реализацию.

Ответы [ 2 ]

1 голос
/ 13 июня 2010
  1. Я вижу, как вы декодируете изображение и сжимаете его обратно на диск, после чего вы декодируете его снова.Не очень эффективно, я думаю.Вы можете просто сохранить поток из сети на диск, после чего распаковать его.Это будет только одна распаковка вместо 3 сжатие / распаковка.Это сэкономит вам много времени на обработку процессора.

  2. Я думаю, AsyncTask создает несколько потоков для нескольких изображений.Таким образом, несколько изображений сжимаются / распаковываются одновременно, несколько потоков борются за процессорное время, что не очень хорошо.Насколько я знаю, AsyncTask использует пул потоков, поэтому он не запускает новый поток для каждого изображения.Но в любом случае несколько потоков одновременно не так хорошо.Я согласен, что очередь будет намного более эффективной.Реализация не так сложно, чтобы создать его самостоятельно.Я использую свою собственную реализацию очереди, и я вполне доволен ею.

  3. Если у вас есть собственный поток, я думаю, что было бы возможно дать ему более низкий приоритет.Это сделает пользовательский интерфейс более отзывчивым.

  4. Вам, безусловно, нужен какой-то кэш в памяти, иначе пользовательский интерфейс не может быть достаточно быстрым.Распаковка идет медленно.Вы можете хранить не все изображения, а только наиболее используемые.Вы можете использовать SoftReference для реализации кеша.Вы можете использовать опцию inSampleSize, чтобы сделать ваши растровые изображения меньше и занимать меньше памяти Странно нехватка памяти при загрузке изображения в растровый объект .

Я сделал полныйПример LazyList и опубликованный источник, также может быть полезным Ленивая загрузка изображений в ListView .

1 голос
/ 12 июня 2010

Ключ объяснен в примере List13.java

В основном вы должны отслеживать состояние прокрутки вашего listView и уведомлять адаптер, когда он готов сделать что-то медленное столько видимые элементы.

Также обратите внимание, что сохранение изображений на диск - очень медленный процесс.Использование состояния кэша на основе памяти значительно улучшит приложение вашей производительности.

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