我不确定是否应该使用带有Universal Image Loader的ViewPager作为类似画廊的界面的替代品,因为我在从SD卡加载图像并在全屏模式下查看它们时遇到了内存溢出错误。无论数量是多少,在GridView中运行得非常好,但是在ViewPager中查看图像时,每个位图会占用大量内存,并且在大约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();
我正在使用库提供的示例项目,但是那些设置也不起作用,它会在一段时间后崩溃。我的猜测是有一个特定的回调函数,我必须从那些不可见的视图中回收位图。
编辑:我知道这是内存泄漏,那些不可见的视图会在应该销毁时被销毁,但内存没有如预期释放。下面是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;
}
@Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); }
- Sazzad Hissain Khan