2016-06-14 35 views
1

在添加ViewPager并运行某些OutOfMemory错误时,我意识到我的缺省方法ImageView.setImageResource(resId)导致分配的RAM比需要的多9倍。在我的例子中,我有一个1920 x 1080的图像,在原始分辨率比它放置的ImageView对象稍大。我可以期待一些图像缩小,但不会期望分配超过12.6 MB(1920 x 1080 x 4字节)。但是,每个映像分配了74.6 MB,并且快速加载了4个映像,将虚拟机内存预算带走。Android按照默认要求为每个ImageView分配9个内存

为了解决这个问题,我改变了方法,下面稍长码 - 现在每个图像正好分配的内存预期(12.6 MB)的原生量,图像仍快速加载,很好看。

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = false; 
options.inSampleSize = 1; 
Bitmap bm = BitmapFactory.decodeResource(getResources(), resId, options); 
mImageView.setImageBitmap(bm); 

作为参考,我的设备是一台Nexus 5 1920×1080,xxhdpi,3倍的缩放因子(DP到像素)。我想在内部,操作系统会将图像向上缩放3x3(= 9x)以匹配比例因子,但这是没有意义的,因为原始图像是全屏大小的原始分辨率。

是什么,他们最初被分配这么多内存的原因,以及是否有设置图像资源,以避免这种浪费内存的正确方法?

+0

什么目录是资源吗? 'drawable'? '绘制,xxhdpi'? – ianhanniballake

+0

的资源是在'drawable' – kirrer

回答

0

可绘制在drawable文件夹被视为mdpi(即,1×)。因此,系统会自动将图像放大至原始密度,并在每个方向上将其尺寸扩大3倍,共计9倍的内存使用量。

如果您希望系统将其作为原始分辨率使用,并且系统会将其缩小至低密度设备,则应将图像移至drawable-xxhdpi

如果您需要所有密度上的固定像素数(即不同密度设备的屏幕上不同的物理尺寸),则可以使用drawable-nodpi文件夹。

+0

这就是它 - 我通过把图像的绘制,xxhdpi文件夹验证,分配的内存是完全符合市场预期。虽然我不会默认这种行为,但现在对我来说很有意义。感谢你的回答!我也赞成你的回答,但显然没有足够的代表我的意见重要 - 但。 – kirrer