在添加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