2016-06-14 29 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