Подтвердить что ты не робот

Элементы Listview удаляют растровые изображения из памяти, когда пользователь прокручивает

Я работаю над приложением для Android. У меня есть активность, которая содержит представление списка.

В представлении списка есть много элементов, каждый из которых содержит растровое изображение.

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

Итак, я ищу способ сделать следующее для старых устройств:

  • Загрузите растровые изображения для элементов, находящихся в представлении (или рядом с ним).
  • Когда пользователь прокручивается вниз, я загружаю растровые изображения, которые должны отображаться ему , и удаляем растровые изображения, которые теперь скрыты.
  • Поэтому в любое время только изображения, которые находятся в представлении (или рядом с ним), загружаются в кучу, а остальные удаляются, когда они больше не видны.

Есть ли способ сделать это?

Дополнительная информация:

Я следил за каждой инструкцией и кодом о том, как эффективно загружать изображения Bitmap (в документации по Android и на любом сайте, который я мог найти), я также удостоверился, что нет утечек памяти, я перерабатываю каждый растровый рисунок и удостоверяюсь, что GC работает правильно и, наконец, на старых устройствах я сделал разрешение изображений наименьшим возможным. Но размер списка вызывает нехватку памяти, которая по-прежнему появляется на некоторых устройствах.

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

Большое спасибо за любую помощь

4b9b3361

Ответ 1

Вам следует рассмотреть возможность просмотра приложения "Пример галереи" из Google I/O 2012. Все, что вам нужно, реализовано там.

Видео с Google I/O о приложении галереи

Исходный код доступен в Google Code, и это отличный пример создания галереи. Вы также должны рассмотреть возможность просмотра презентации Romain Guy (начало), где он объясняет проблемы производительности с помощью ListView и учит эффективно использовать адаптеры. (Шаблон ViewHolder и повторное использование представлений).

Здесь RecycleListener для GridView (доступен с уровня API 1). RecyclerListener используется для получения уведомлений всякий раз, когда представление помещается внутри кучи отходов RecycleBin. Этот прослушиватель используется для освобождения ресурсов, связанных с представлениями, размещенными в RecycleBin.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.album);

    mAdapter = new PhotoAdapter(this);

    mGridView = (GridView) findViewById(android.R.id.list);
    mGridView.setAdapter(mAdapter);

    mGridView.setRecyclerListener(new RecyclerListener() {
        @Override
        public void onMovedToScrapHeap(View view) {
            // Release strong reference when a view is recycled
            final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon);
            imageView.setImageBitmap(null);
        }
    });

    // Kick off loader for Cursor with list of photos
    getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks);
}

Ответ 2

Вы хотите найти несколько уроков и примеров для "ленивой загрузки".
Одним из возможных примеров может быть: https://github.com/thest1/LazyList

Ответ 3

Использование библиотеки, такой как Универсальный загрузчик изображений дает вам варианты кэширования изображений и управления памятью. Вы должны иметь возможность установить максимальный размер кеша, и он также заботится о загрузке изображений в фоновом потоке.

ListView позаботится о том, чтобы повторно использовать представления, которые вы помещали изображения в удобное для вас время.