Элементы Listview удаляют растровые изображения из памяти, когда пользователь прокручивает
Я работаю над приложением для Android. У меня есть активность, которая содержит представление списка.
В представлении списка есть много элементов, каждый из которых содержит растровое изображение.
Поскольку список очень большой и содержит много изображений, он выдает и выдает из памяти ошибку на некоторых старых устройствах при загрузке растровых изображений.
Итак, я ищу способ сделать следующее для старых устройств:
- Загрузите растровые изображения для элементов, находящихся в представлении (или рядом с ним).
- Когда пользователь прокручивается вниз, я загружаю растровые изображения, которые должны отображаться ему , и удаляем растровые изображения, которые теперь скрыты.
- Поэтому в любое время только изображения, которые находятся в представлении (или рядом с ним), загружаются в кучу, а остальные удаляются, когда они больше не видны.
Есть ли способ сделать это?
Дополнительная информация:
Я следил за каждой инструкцией и кодом о том, как эффективно загружать изображения Bitmap (в документации по Android и на любом сайте, который я мог найти), я также удостоверился, что нет утечек памяти, я перерабатываю каждый растровый рисунок и удостоверяюсь, что GC работает правильно и, наконец, на старых устройствах я сделал разрешение изображений наименьшим возможным. Но размер списка вызывает нехватку памяти, которая по-прежнему появляется на некоторых устройствах.
Поэтому я хочу знать, смогу ли я выполнить предложенное выше решение.
Большое спасибо за любую помощь
Ответы
Ответ 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 позаботится о том, чтобы повторно использовать представления, которые вы помещали изображения в удобное для вас время.