標籤:
從網上學習了MAT外掛程式來查看記憶體使用量情況,分析之後發現手上的應用對本地圖片這邊的記憶體損耗很大,查了相關資料之後發現,如果採用setImageBitmap、setImageResource這些來載入本地資源,會產生較大的損耗。因為這些方法在完成 decode 後,最終都是通過 Java 層的 createBitmap 來完成的,需要消耗更多記憶體。因此,改用先通過 BitmapFactory.decodeStream 方法,建立出一個 bitmap,再將其設為 ImageView 的 source,decodeStream 最大的秘密在於其直接調用 JNI>>nativeDecodeAsset() 來完成 decode,無需再使用 Java 層的 createBitmap,從而節省了 Java 層的空間。如果在讀取時加片的 Config 參數,可以更有效減少載入的記憶體,從而更有效阻止拋出記憶體異常。(http://www.cnblogs.com/sunzn/archive/2013/03/14/2960293.html)
之後根據實際情境採取以下最佳化方案:
1.對圖片做適當的裁剪、降低品質。(圖片大小減少了很多,但是節省記憶體效果一般,堆佔用從3M減少到2m)
2.因為使用情境是這張圖片是一張大的背景圖,在不知道setImageResource會產生比較大消耗的時候想出了把圖片傳到web上,利用載入圖片的第三方庫來載入的辦法。
3.在尋找資料瞭解了產生消耗的原因時,採取了decodeStream的辦法,效果顯著,減少到幾十k。
InputStream is = this.getResources().openRawResource(R.drawable.bg_header_dynamic);BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = false;options.inPreferredConfig = Bitmap.Config.RGB_565; options.inPurgeable = true; options.inInputShareable = true; options.inSampleSize = 1;Bitmap btp =BitmapFactory.decodeStream(is,null,options);im_bg.setImageBitmap(btp);
最佳化前
最佳化後
android記憶體分析、載入本地圖片記憶體最佳化