在添加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)以匹配比例因子,但这是没有意义的,因为原始图像是全屏大小的原始分辨率。
是什么,他们最初被分配这么多内存的原因,以及是否有设置图像资源,以避免这种浪费内存的正确方法?
什么目录是资源吗? 'drawable'? '绘制,xxhdpi'? – ianhanniballake
的资源是在'drawable' – kirrer