Я не уверен, что ViewPager с Universal Image Loader может/должен использоваться в качестве альтернативы для галереи, такой как интерфейс, так как я столкнулся с ошибкой "Недостаточно памяти" при загрузке изображений с SD-карты и просмотре их в полноэкранном режиме Режим. Независимо от того, какой номер, он отлично работает с GridView, но при просмотре изображений в представлении Pager каждый битмап продолжает есть много памяти и после 10 или около того изображений он выдает ошибку из памяти.
Я видел почти все вопросы, которые были размещены здесь, связанные с ошибкой "Недостаточно памяти" при работе с Universal Image Loader, и в каждом из них в качестве причины была ошибка конфигурации.
Я не знаю, использую ли я неправильные конфигурации или что, но я потратил много времени на это и застрял, любая помощь/совет будут оценены.
Конфигурации для ImageLoader:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
.memoryCache(new WeakMemoryCache())
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.imageDownloader(new ExtendedImageDownloader(getApplicationContext()))
.tasksProcessingOrder(QueueProcessingType.LIFO)
// .enableLogging() // Not necessary in common
.build();
Параметры изображения:
options = new DisplayImageOptions.Builder()
.showImageForEmptyUri(R.drawable.image_for_empty_url)
.resetViewBeforeLoading()
.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
.bitmapConfig(Bitmap.Config.RGB_565)
.displayer(new FadeInBitmapDisplayer(300))
.build();
Я использую пример проекта, который был предоставлен в библиотеке, но эти настройки не будут работать, он просто сработает через некоторое время. Я предполагаю, что существует конкретный обратный вызов, когда мне приходится перерабатывать растровые изображения из представлений, которые не видны.
EDIT: я знаю, что это утечка памяти. Представления, которые не видны, уничтожаются, когда они должны быть, но память не освобождается, как следует. Это реализация обратного вызова destroyItem, следуя советам, приведенным в разных вопросах, но все же не может найти утечку памяти.
@Override
public void destroyItem(View container, int position, Object object) {
// ((ViewPager) container).removeView((View) object);
Log.d("DESTROY", "destroying view at position " + position);
View view = (View)object;
((ViewPager) container).removeView(view);
view = null;
}