精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Android開發優化之——對Bitmap的內存優化

移動開發 Android
在Android應用里,最耗費內存的就是圖片資源。而且在Android系統中,讀取位圖Bitmap時,分給虛擬機中的圖片的堆棧大小只有8M,如果超出了,就會出現OutOfMemory異常。所以,對于圖片的內存優化,是Android應用開發中比較重要的內容。

在Android應用里,最耗費內存的就是圖片資源。而且在Android系統中,讀取位圖Bitmap時,分給虛擬機中的圖片的堆棧大小只有8M,如果超出了,就會出現OutOfMemory異常。所以,對于圖片的內存優化,是Android應用開發中比較重要的內容。

1) 要及時回收Bitmap的內存

Bitmap類有一個方法recycle(),從方法名可以看出意思是回收。這里就有疑問了,Android系統有自己的垃圾回收機制,可以不定期的回收掉不使用的內存空間,當然也包括Bitmap的空間。那為什么還需要這個方法呢?

Bitmap類的構造方法都是私有的,所以開發者不能直接new出一個Bitmap對象,只能通過BitmapFactory類的各種靜態方法來實例化一個Bitmap。仔細查看BitmapFactory的源代碼可以看到,生成Bitmap對象最終都是通過JNI調用方式實現的。所以,加載Bitmap到內存里以后,是包含兩部分內存區域的。簡單的說,一部分是Java部分的,一部分是C部分的。這個Bitmap對象是由Java部分分配的,不用的時候系統就會自動回收了,但是那個對應的C可用的內存區域,虛擬機是不能直接回收的,這個只能調用底層的功能釋放。所以需要調用recycle()方法來釋放C部分的內存。從Bitmap類的源代碼也可以看到,recycle()方法里也的確是調用了JNI方法了的。

那如果不調用recycle(),是否就一定存在內存泄露呢?也不是的。Android的每個應用都運行在獨立的進程里,有著獨立的內存,如果整個進程被應用本身或者系統殺死了,內存也就都被釋放掉了,當然也包括C部分的內存。

Android對于進程的管理是非常復雜的。簡單的說,Android系統的進程分為幾個級別,系統會在內存不足的情況下殺死一些低優先級的進程,以提供給其它進程充足的內存空間。在實際項目開發過程中,有的開發者會在退出程序的時候使用Process.killProcess(Process.myPid())的方式將自己的進程殺死,但是有的應用僅僅會使用調用Activity.finish()方法的方式關閉掉所有的Activity。

經驗分享:

Android手機的用戶,根據習慣不同,可能會有兩種方式退出整個應用程序:一種是按Home鍵直接退到桌面;另一種是從應用程序的退出按鈕或者按Back鍵退出程序。那么從系統的角度來說,這兩種方式有什么區別呢?按Home鍵,應用程序并沒有被關閉,而是成為了后臺應用程序。按Back鍵,一般來說,應用程序關閉了,但是進程并沒有被殺死,而是成為了空進程(程序本身對退出做了特殊處理的不考慮在內)。

Android系統已經做了大量進程管理的工作,這些已經可以滿足用戶的需求。個人建議,應用程序在退出應用的時候不需要手動殺死自己所在的進程。對于應用程序本身的進程管理,交給Android系統來處理就可以了。應用程序需要做的,是盡量做好程序本身的內存管理工作。

一般來說,如果能夠獲得Bitmap對象的引用,就需要及時的調用Bitmap的recycle()方法來釋放Bitmap占用的內存空間,而不要等Android系統來進行釋放。

下面是釋放Bitmap的示例代碼片段。

  1. // 先判斷是否已經回收 
  2.  
  3. if(bitmap != null && !bitmap.isRecycled()){   
  4.  
  5.         // 回收并且置為null 
  6.  
  7.         bitmap.recycle();   
  8.  
  9.         bitmap = null;   
  10.  
  11. }   
  12.  
  13. System.gc(); 
  14.   

從上面的代碼可以看到,bitmap.recycle()方法用于回收該Bitmap所占用的內存,接著將bitmap置空,最后使用System.gc()調用一下系統的垃圾回收器進行回收,可以通知垃圾回收器盡快進行回收。這里需要注意的是,調用System.gc()并不能保證立即開始進行回收過程,而只是為了加快回收的到來。

如何調用recycle()方法進行回收已經了解了,那什么時候釋放Bitmap的內存比較合適呢?一般來說,如果代碼已經不再需要使用Bitmap對象了,就可以釋放了。釋放內存以后,就不能再使用該Bitmap對象了,如果再次使用,就會拋出異常。所以一定要保證不再使用的時候釋放。比如,如果是在某個Activity中使用Bitmap,就可以在Activity的onStop()或者onDestroy()方法中進行回收。

2) 捕獲異常

因為Bitmap是吃內存大戶,為了避免應用在分配Bitmap內存的時候出現OutOfMemory異常以后Crash掉,需要特別注意實例化Bitmap部分的代碼。通常,在實例化Bitmap的代碼中,一定要對OutOfMemory異常進行捕獲。

以下是代碼示例。

  1. Bitmap bitmap = null
  2.  
  3. try { 
  4.  
  5.     // 實例化Bitmap 
  6.  
  7.     bitmap = BitmapFactory.decodeFile(path); 
  8.  
  9. catch (OutOfMemoryError e) { 
  10.  
  11.     // 
  12.  
  13.  
  14. if (bitmap == null) { 
  15.  
  16.     // 如果實例化失敗 返回默認的Bitmap對象 
  17.  
  18.     return defaultBitmapMap; 
  19.  
  20.   

這里對初始化Bitmap對象過程中可能發生的OutOfMemory異常進行了捕獲。如果發生了OutOfMemory異常,應用不會崩潰,而是得到了一個默認的Bitmap圖。

經驗分享:

    很多開發者會習慣性的在代碼中直接捕獲Exception。但是對于OutOfMemoryError來說,這樣做是捕獲不到的。因為OutOfMemoryError是一種Error,而不是Exception。在此僅僅做一下提醒,避免寫錯代碼而捕獲不到OutOfMemoryError。

3) 緩存通用的Bitmap對象

有時候,可能需要在一個Activity里多次用到同一張圖片。比如一個Activity會展示一些用戶的頭像列表,而如果用戶沒有設置頭像的話,則會顯示一個默認頭像,而這個頭像是位于應用程序本身的資源文件中的。

如果有類似上面的場景,就可以對同一Bitmap進行緩存。如果不進行緩存,盡管看到的是同一張圖片文件,但是使用BitmapFactory類的方法來實例化出來的Bitmap,是不同的Bitmap對象。緩存可以避免新建多個Bitmap對象,避免內存的浪費。

經驗分享:

    Web開發者對于緩存技術是很熟悉的。其實在Android應用開發過程中,也會經常使用緩存的技術。這里所說的緩存有兩個級別,一個是硬盤緩存,一個是內存緩存。比如說,在開發網絡應用過程中,可以將一些從網絡上獲取的數據保存到SD卡中,下次直接從SD卡讀取,而不從網絡中讀取,從而節省網絡流量。這種方式就是硬盤緩存。再比如,應用程序經常會使用同一對象,也可以放到內存中緩存起來,需要的時候直接從內存中讀取。這種方式就是內存緩存。

4) 壓縮圖片

如果圖片像素過大,使用BitmapFactory類的方法實例化Bitmap的過程中,需要大于8M的內存空間,就必定會發生OutOfMemory異常。這個時候該如何處理呢?如果有這種情況,則可以將圖片縮小,以減少載入圖片過程中的內存的使用,避免異常發生。

使用BitmapFactory.Options設置inSampleSize就可以縮小圖片。屬性值inSampleSize表示縮略圖大小為原始圖片大小的幾分之一。即如果這個值為2,則取出的縮略圖的寬和高都是原始圖片的1/2,圖片的大小就為原始大小的1/4。

如果知道圖片的像素過大,就可以對其進行縮小。那么如何才知道圖片過大呢?

使用BitmapFactory.Options設置inJustDecodeBounds為true后,再使用decodeFile()等方法,并不會真正的分配空間,即解碼出來的Bitmap為null,但是可計算出原始圖片的寬度和高度,即options.outWidth和options.outHeight。通過這兩個值,就可以知道圖片是否過大了。

  1. BitmapFactory.Options opts = new BitmapFactory.Options(); 
  2.  
  3.     // 設置inJustDecodeBounds為true 
  4.  
  5.     opts.inJustDecodeBounds = true
  6.  
  7.     // 使用decodeFile方法得到圖片的寬和高 
  8.  
  9.     BitmapFactory.decodeFile(path, opts); 
  10.  
  11.     // 打印出圖片的寬和高 
  12.  
  13.     Log.d("example", opts.outWidth + "," + opts.outHeight); 
  14.   

在實際項目中,可以利用上面的代碼,先獲取圖片真實的寬度和高度,然后判斷是否需要跑縮小。如果不需要縮小,設置inSampleSize的值為1。如果需要縮小,則動態計算并設置inSampleSize的值,對圖片進行縮小。需要注意的是,在下次使用BitmapFactory的decodeFile()等方法實例化Bitmap對象前,別忘記將opts.inJustDecodeBound設置回false。否則獲取的bitmap對象還是null。

經驗分享:

如果程序的圖片的來源都是程序包中的資源,或者是自己服務器上的圖片,圖片的大小是開發者可以調整的,那么一般來說,就只需要注意使用的圖片不要過大,并且注意代碼的質量,及時回收Bitmap對象,就能避免OutOfMemory異常的發生。

如果程序的圖片來自外界,這個時候就特別需要注意OutOfMemory的發生。一個是如果載入的圖片比較大,就需要先縮小;另一個是一定要捕獲異常,避免程序Crash。

責任編輯:張葉青 來源: 技術博客
相關推薦

2013-09-16 15:42:00

Android優化界面UI

2013-09-16 15:33:28

Android優化界面UI

2013-09-16 15:50:04

Android優化界面UI

2013-02-20 14:32:37

Android開發性能

2013-09-16 16:01:23

Android開發代碼

2014-10-30 10:53:22

Android內存優化

2021-07-29 14:20:34

網絡優化移動互聯網數據存儲

2017-12-23 14:38:41

Android編程開發優化

2019-12-13 10:25:08

Android性能優化啟動優化

2017-01-15 15:13:37

Android性能優化優化點

2017-03-14 18:48:06

Android性能優化內存優化

2013-09-17 10:32:08

Android性能優化數據庫

2013-09-16 13:14:50

Android開發者優化

2017-02-14 17:00:39

iOSApp內存優化

2015-09-16 15:21:23

Android性能優化內存

2016-12-22 17:21:11

Android性能優化內存泄漏

2011-06-22 17:11:18

SEO

2013-05-21 10:42:48

Android游戲開發Bitmap位圖旋轉

2011-07-21 16:40:28

網站優化

2013-09-16 16:48:50

Android優化軟引用
點贊
收藏

51CTO技術棧公眾號

无码人妻精品一区二区三区66| 国产精品欧美久久| 日本 欧美 国产| 少妇精品在线| 色88888久久久久久影院野外| 天堂一区二区三区| 亚洲黄色片视频| 亚洲欧美日韩国产| 日韩中文字幕在线观看| 中文字幕第3页| 日韩成人免费观看| 欧美在线观看视频一区| 欧美日韩国产影片| 鲁一鲁一鲁一鲁一色| 欧美日本一道| 91色porny| 亚洲影院在线看| 成人欧美一区二区三区黑人一| 午夜免费欧美电影| 欧美色综合网站| 欧美日韩国产高清视频| 精品久久久久成人码免费动漫| 久久久久久穴| 亚洲摸下面视频| 亚洲 自拍 另类 欧美 丝袜| 亚洲va久久久噜噜噜无码久久| 妖精视频成人观看www| 久久精品人人爽| 国产激情在线免费观看| 97青娱国产盛宴精品视频| 欧美日韩精品一二三区| 欧美激情成人网| 日韩伦理在线一区| 亚洲人成电影网站色mp4| 国产日韩中文字幕| 国产黄色免费视频| 国产精品女主播一区二区三区| 久久不射电影网| 波多野结衣一二三四区| 九九精品久久| 国产视频一区在线| 白嫩少妇丰满一区二区| 女囚岛在线观看| 成人丝袜高跟foot| 91沈先生在线观看| 一区二区三区www污污污网站| 精品国产一区二区三区香蕉沈先生| 精品美女一区二区三区| www.色.com| 精品视频在线观看免费观看| 欧美日本一区二区三区四区| 青青草精品视频在线观看| 台湾佬中文娱乐网欧美电影| 亚洲第一在线综合网站| 99久久免费观看| 久久久123| 亚洲午夜精品一区二区三区他趣| 国产成人生活片| 欧美性video| 一区二区在线观看免费视频播放| 青青草综合视频| 丁香高清在线观看完整电影视频| 亚洲一区二区三区三| www.成年人视频| 91豆花视频在线播放| 五月激情丁香一区二区三区| 欧美网站免费观看| 户外露出一区二区三区| 欧美日韩一区小说| 亚洲a级黄色片| 国产福利一区二区精品秒拍| 亚洲第一黄色网| 黄色手机在线视频| 高清在线一区二区| 精品88久久久久88久久久| 影音先锋人妻啪啪av资源网站| 91超碰碰碰碰久久久久久综合| 在线一区二区观看| 色一情一区二区三区| 精品一区二区三区在线观看视频| 精品国产一区久久| 欧美成人午夜精品免费| 成人午夜国产| 欧美多人乱p欧美4p久久| 中文字幕在线观看免费视频| 视频一区国产视频| 亚洲va男人天堂| 天天综合网天天综合| 91免费国产在线| 自拍偷拍亚洲色图欧美| 国产精品蜜臀| 在线观看一区二区精品视频| 一个人看的视频www| 99这里只有精品视频| 亚洲人成毛片在线播放| 东方av正在进入| 午夜一区二区三区不卡视频| 国产日韩欧美视频在线| 少妇人妻一区二区| 中文子幕无线码一区tr| 欧美中日韩在线| 精品无人乱码一区二区三区| 精品国产123| 日本午夜精品视频| 99视频精品| 91精品在线一区| 欧美视频免费一区二区三区| 亚洲视频精选在线| 免费观看成人在线视频| 999在线精品| 色多多国产成人永久免费网站 | 一区二区三区成人在线视频| 欧美黄色免费影院| 欧美家庭影院| 欧美性极品少妇| www.日本高清| 欧美体内she精视频在线观看| 日韩美女视频免费在线观看| 午夜精品在线播放| 国产精品美女久久久久久久久| 奇米影视亚洲色图| 新版中文在线官网| 欧美亚洲综合网| 一区二区三区免费在线观看视频 | 久久午夜电影网| 福利在线小视频| 国产精品黄色片| 亚洲欧美日本另类| 成年免费在线观看| 成人国产精品免费观看| 国产日产精品一区二区三区四区| 在线播放日本| 欧美日韩一区二区不卡| 美女久久久久久久久久| 亚洲国产三级| 国产精品国产三级国产专区53 | 天堂中文在线观看视频| 亚洲乱码日产精品bd| 菠萝蜜视频在线观看入口| 日韩一区二区三区免费视频| 亚洲欧洲高清在线| 日韩不卡在线播放| 91麻豆.com| 丰满爆乳一区二区三区| 欧美精品中文字幕亚洲专区| 久久久亚洲欧洲日产国码aⅴ| 毛片视频网站在线观看| 成人av一区二区三区| 香港三级日本三级a视频| 激情视频亚洲| 欧美大片va欧美在线播放| 精品国产免费观看| 成人黄色网址在线观看| 五十路熟女丰满大屁股| 日韩mv欧美mv国产网站| 欧美一区二区视频97| 男人天堂综合| 欧美性三三影院| 欧美精品日韩在线| 精品无人码麻豆乱码1区2区| 中文字幕乱码一区二区三区| 大胆国模一区二区三区| 久久99久久99精品免观看粉嫩 | 中文字幕精品国产| 91中文字幕在线视频| 亚洲色图欧美激情| 性高潮免费视频| 日本道不卡免费一区| 国产精品一区二区久久精品| 欧美jizzhd欧美| 精品乱人伦小说| 91av在线免费视频| 国产精品午夜久久| 亚洲综合伊人久久| 亚洲欧洲一级| 亚洲高清视频在线观看| 国产麻豆一区二区三区| 欧美精品激情在线| 亚洲最新av网站| 亚洲精品你懂的| 日批视频免费看| 久久久久久亚洲精品杨幂换脸| 亚洲一区二三| 9l亚洲国产成人精品一区二三| 欧美一区二区三区四区在线| 麻豆免费在线视频| 亚洲护士老师的毛茸茸最新章节 | 欧美一区二区三区视频在线观看| 免费无码毛片一区二区app| 久久众筹精品私拍模特| 五月婷婷之婷婷| 国产精品美女| 日日噜噜夜夜狠狠久久丁香五月| 啪啪国产精品| 成人www视频在线观看| 九色porny自拍视频在线播放| 中文字幕在线精品| 日本福利片高清在线观看| 4438x亚洲最大成人网| 四虎精品永久在线| 一区二区在线观看免费视频播放| 一区二区三区四区免费| 国产成人在线影院| 黄色成人免费看| 亚洲精品美女91| 99re8这里只有精品| 九九免费精品视频在线观看| 成人一区二区在线| 嫩草伊人久久精品少妇av杨幂| 久久久亚洲国产| 国产超级va在线视频| 亚洲天堂日韩电影| 天堂成人在线观看| 日韩色视频在线观看| www.5588.com毛片| 国产日韩欧美精品一区| 伊人久久一区二区三区| 国内精品第一页| av网站在线不卡| 麻豆91精品| 国产精品裸体瑜伽视频| 中文字幕午夜精品一区二区三区| 天堂√在线观看一区二区| 天堂一区二区三区四区| 国产伦精品一区二区三毛| 成人在线日韩| 91精品国产综合久久香蕉最新版| 欧美黑人巨大xxxxx| 亚洲深夜福利网站| 五月天激情开心网| 欧美精品一区二区在线播放| 精品国产亚洲一区二区麻豆| 欧美日韩一区在线| 亚洲自拍偷拍另类| 欧美电影一区二区| 国产精品久久婷婷| 欧美区一区二区三区| 久久久久久av无码免费看大片| 欧美日韩中文在线观看| 综合激情网五月| 狠狠干狠狠久久| 免费在线观看黄网站| 精品福利在线视频| 丰满少妇乱子伦精品看片| 午夜精品福利久久久| 黄色片视频网站| 黑人巨大精品欧美一区二区一视频 | 98精品国产高清在线xxxx天堂| 三级资源在线| 欧美精品xxx| 国产福利电影在线播放| 亚洲伦理中文字幕| 五月激情六月婷婷| 亚洲免费视频网站| 91亚洲欧美| 日韩视频永久免费观看| 精品国产丝袜高跟鞋| 日韩国产精品亚洲а∨天堂免| 日韩中文字幕免费在线观看| 亚洲国产成人爱av在线播放| 亚洲av成人精品一区二区三区在线播放 | 国产精品美乳在线观看| 91精选在线| 欧美黄色成人网| 9999热视频在线观看| 欧美在线一级va免费观看| 朝桐光一区二区| 国产在线精品成人一区二区三区| 精品91福利视频| 国产欧美综合精品一区二区| 最新亚洲精品| 亚洲欧美国产不卡| 欧美激情aⅴ一区二区三区| aa视频在线播放| 日韩电影一二三区| 天天久久综合网| 91免费观看视频| 青青青视频在线免费观看| 一区二区三区美女视频| 性色av免费观看| 91麻豆精品久久久久蜜臀| 欧美一区二区三区黄片| 一区二区三区高清国产| 丝袜美腿av在线| 日韩av手机在线观看| 2020国产精品小视频| 激情视频一区二区| 欧美第一在线视频| 蜜桃传媒视频麻豆一区 | 91网站在线观看视频| 我不卡一区二区| 亚洲影视在线播放| 日本成人一级片| 精品88久久久久88久久久| 尤物在线视频| 4k岛国日韩精品**专区| 亚洲午夜剧场| 欧美一级片免费观看| 亚洲精品456| 国产欧美亚洲日本| 成人羞羞网站入口| 欧美日韩一道本| 国产精品一区二区久久不卡| 欧美特级黄色录像| 亚洲成国产人片在线观看| 中文字幕在线观看精品| 日韩电影在线观看中文字幕| 国产黄色小视频在线| 国产精品久久久久久久久久ktv | 日韩aⅴ视频一区二区三区| 伊人成综合网yiren22| 久久观看最新视频| 男人操女人的视频在线观看欧美| 精品国产乱码久久久久夜深人妻| 国产精品不卡在线观看| 懂色av蜜臀av粉嫩av分享吧最新章节| 日韩精品一区二区三区蜜臀 | 亚洲a级精品| 隔壁人妻偷人bd中字| 国产美女在线观看一区| 日本综合在线观看| 色综合天天综合狠狠| 日批视频在线播放| 久久91精品国产91久久跳| 亚洲国产伊人| 91传媒视频在线观看| 日韩av久操| 天天色综合天天色| 国产欧美在线观看一区| 亚洲第一精品在线观看| 亚洲国产欧美自拍| xxxx成人| 国产精品免费区二区三区观看| 欧美福利一区| 在线观看网站黄| 亚洲码国产岛国毛片在线| 国产亲伦免费视频播放| 久久影院模特热| www一区二区三区| 黄色网址在线免费看| 九一九一国产精品| 91传媒免费观看| 欧美一级久久久| 日本aa在线| 国产精品三区www17con| 亚洲手机视频| 亚洲 欧美 日韩系列| 国产亚洲欧美一区在线观看| 欧美男人亚洲天堂| 在线午夜精品自拍| 免费高清视频在线一区| 亚洲女人毛片| 国产美女久久久久| 欧美日韩免费一区二区| 欧美成人免费网站| 在线黄色的网站| 欧美日韩一区在线视频| 日韩电影一区二区三区四区| 萌白酱视频在线| 欧美一级夜夜爽| 黄色美女视频在线观看| 精品久久蜜桃| 久久一本综合频道| 亚洲天堂av中文字幕| 91精品国产综合久久精品图片| 国产高清一区二区三区视频| 国产精品久久国产精品| 亚洲在线成人| 老司机精品免费视频| 91精品国模一区二区三区| 色女人在线视频| 欧美日韩在线精品一区二区三区| 日韩福利视频导航| 天天天天天天天天操| 精品99999| 福利一区和二区| 乱熟女高潮一区二区在线| 91免费看视频| 97成人在线观看| 97婷婷大伊香蕉精品视频| 国产欧美日韩精品一区二区三区| 色乱码一区二区三区在线| 亚洲最色的网站| 国产福利小视频在线观看| 3d精品h动漫啪啪一区二区| 国产欧美综合一区二区三区| 成人午夜免费影院| 亚洲国产福利在线| 欧美xxxx性| 免费观看日韩毛片| 中文字幕一区二区三区乱码在线| 亚洲免费不卡视频| 国产精品视频网| 亚洲人成久久| 亚洲色偷偷综合亚洲av伊人| 日韩精品在线观看一区| 榴莲视频成人app| 久久久久久久片| 亚洲成在线观看| 黄色片免费在线观看|