android記憶體分析、載入本地圖片記憶體最佳化

來源:互聯網
上載者:User

標籤:

從網上學習了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記憶體分析、載入本地圖片記憶體最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.