通用图像加载器将缩小的图像保存在内存中以节省内存。计算每个缩小图像的大小,它取决于该图像的目标 ImageView(考虑android:layout_width
, android:layout_height
, android:maxWidth
,android:maxHeight
参数, android:scaleType
, 设备屏幕尺寸)。
默认情况下,每个图像的最大目标大小是设备的屏幕大小。因此,您的图像尺寸与设备屏幕尺寸相似,并且在缩放时会看到质量不佳。
因此,您应该在 ImageView 中加载全尺寸图像(以支持缩放而不损失质量)。
为内存中的缓存图像设置自己的最大大小:
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
...
.memoryCacheExtraOptions(1200, 1000) // maximum width and height of your images
...
.build();
在这种情况下,您将在内存中加载大型位图,因此我建议不要将它们缓存在内存中。禁用这些图像的内存缓存(不要.cachenMemory()
在 DisplayImageOptions 中调用)并设置.imageScaleType(ImageScaleType.EXACT)
. 您可以全局禁用它们(in .defaultDisplayImageOptions(...)
)或为每个显示任务禁用它们(imageLoader.displayImage(...)
)
防止OOM:
- 禁用这些图像的内存缓存(不要
.cachenMemory()
在 DisplayImageOptions 中调用)
- 放
.imageScaleType(ImageScaleType.EXACT)
- 设置
.threadPoolSize(1)
(最后一次尝试)
回收适配器中的位图:
private class ImagePagerAdapter extends PagerAdapter {
...
@Override
public void destroyItem(View container, int position, Object object) {
View view = (View) object;
((ViewPager) container).removeView(view);
ImageView imageView = (ImageView) view.findViewById(R.id.image);
BitmapDrawable bd = (BitmapDrawable) imageView.getDrawable();
if (bd != null) {
Bitmap bmp = bd.getBitmap();
if (bmp != null) {
bmp.recycle();
}
}
}
...
}