我不确定是否可以/应该将带有 Universal Image Loader 的 ViewPager 用作类似画廊的界面的替代品,因为我在从 SD 卡加载图像并以全屏模式查看它们时遇到了内存不足错误。无论数字是多少,GridView 都可以正常工作,但是在 View Pager 中查看图像时,每个位图都会占用大量内存,并且在 10 个左右的图像之后,它会出现内存不足的错误。
在使用通用图像加载器时,我已经看到了几乎所有与内存不足错误相关的问题,并且在每个问题中,都存在配置错误作为原因。
我不知道我是否使用了错误的配置或什么,但我已经浪费了很多时间并且有点卡住了,任何帮助/建议将不胜感激。
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;
}