亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

解析Android開發(fā)優(yōu)化之:對(duì)Bitmap的內(nèi)存優(yōu)化詳解

2020-04-11 12:25:44
字體:
供稿:網(wǎng)友


1) 要及時(shí)回收Bitmap的內(nèi)存

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

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

那如果不調(diào)用recycle(),是否就一定存在內(nèi)存泄露呢?也不是的。Android的每個(gè)應(yīng)用都運(yùn)行在獨(dú)立的進(jìn)程里,有著獨(dú)立的內(nèi)存,如果整個(gè)進(jìn)程被應(yīng)用本身或者系統(tǒng)殺死了,內(nèi)存也就都被釋放掉了,當(dāng)然也包括C部分的內(nèi)存。

Android對(duì)于進(jìn)程的管理是非常復(fù)雜的。簡單的說,Android系統(tǒng)的進(jìn)程分為幾個(gè)級(jí)別,系統(tǒng)會(huì)在內(nèi)存不足的情況下殺死一些低優(yōu)先級(jí)的進(jìn)程,以提供給其它進(jìn)程充足的內(nèi)存空間。在實(shí)際項(xiàng)目開發(fā)過程中,有的開發(fā)者會(huì)在退出程序的時(shí)候使用Process.killProcess(Process.myPid())的方式將自己的進(jìn)程殺死,但是有的應(yīng)用僅僅會(huì)使用調(diào)用Activity.finish()方法的方式關(guān)閉掉所有的Activity。

經(jīng)驗(yàn)分享:

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

Android系統(tǒng)已經(jīng)做了大量進(jìn)程管理的工作,這些已經(jīng)可以滿足用戶的需求。個(gè)人建議,應(yīng)用程序在退出應(yīng)用的時(shí)候不需要手動(dòng)殺死自己所在的進(jìn)程。對(duì)于應(yīng)用程序本身的進(jìn)程管理,交給Android系統(tǒng)來處理就可以了。應(yīng)用程序需要做的,是盡量做好程序本身的內(nèi)存管理工作。

一般來說,如果能夠獲得Bitmap對(duì)象的引用,就需要及時(shí)的調(diào)用Bitmap的recycle()方法來釋放Bitmap占用的內(nèi)存空間,而不要等Android系統(tǒng)來進(jìn)行釋放。

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

復(fù)制代碼 代碼如下:

// 先判斷是否已經(jīng)回收

if(bitmap != null && !bitmap.isRecycled()){ 

        // 回收并且置為null

        bitmap.recycle(); 

        bitmap = null; 

System.gc();


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

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


2) 捕獲異常

因?yàn)锽itmap是吃內(nèi)存大戶,為了避免應(yīng)用在分配Bitmap內(nèi)存的時(shí)候出現(xiàn)OutOfMemory異常以后Crash掉,需要特別注意實(shí)例化Bitmap部分的代碼。通常,在實(shí)例化Bitmap的代碼中,一定要對(duì)OutOfMemory異常進(jìn)行捕獲。

以下是代碼示例。

復(fù)制代碼 代碼如下:

Bitmap bitmap = null;

try {

    // 實(shí)例化Bitmap

    bitmap = BitmapFactory.decodeFile(path);

} catch (OutOfMemoryError e) {

    //

}

if (bitmap == null) {

    // 如果實(shí)例化失敗 返回默認(rèn)的Bitmap對(duì)象

    return defaultBitmapMap;

}


這里對(duì)初始化Bitmap對(duì)象過程中可能發(fā)生的OutOfMemory異常進(jìn)行了捕獲。如果發(fā)生了OutOfMemory異常,應(yīng)用不會(huì)崩潰,而是得到了一個(gè)默認(rèn)的Bitmap圖。

經(jīng)驗(yàn)分享:

很多開發(fā)者會(huì)習(xí)慣性的在代碼中直接捕獲Exception。但是對(duì)于OutOfMemoryError來說,這樣做是捕獲不到的。因?yàn)镺utOfMemoryError是一種Error,而不是Exception。在此僅僅做一下提醒,避免寫錯(cuò)代碼而捕獲不到OutOfMemoryError。

3) 緩存通用的Bitmap對(duì)象

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

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

經(jīng)驗(yàn)分享:

    Web開發(fā)者對(duì)于緩存技術(shù)是很熟悉的。其實(shí)在Android應(yīng)用開發(fā)過程中,也會(huì)經(jīng)常使用緩存的技術(shù)。這里所說的緩存有兩個(gè)級(jí)別,一個(gè)是硬盤緩存,一個(gè)是內(nèi)存緩存。比如說,在開發(fā)網(wǎng)絡(luò)應(yīng)用過程中,可以將一些從網(wǎng)絡(luò)上獲取的數(shù)據(jù)保存到SD卡中,下次直接從SD卡讀取,而不從網(wǎng)絡(luò)中讀取,從而節(jié)省網(wǎng)絡(luò)流量。這種方式就是硬盤緩存。再比如,應(yīng)用程序經(jīng)常會(huì)使用同一對(duì)象,也可以放到內(nèi)存中緩存起來,需要的時(shí)候直接從內(nèi)存中讀取。這種方式就是內(nèi)存緩存。
 

4) 壓縮圖片

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

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

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

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

復(fù)制代碼 代碼如下:

  BitmapFactory.Options opts = new BitmapFactory.Options();

    // 設(shè)置inJustDecodeBounds為true

    opts.inJustDecodeBounds = true;

    // 使用decodeFile方法得到圖片的寬和高

    BitmapFactory.decodeFile(path, opts);

    // 打印出圖片的寬和高

    Log.d("example", opts.outWidth + "," + opts.outHeight);


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

經(jīng)驗(yàn)分享:

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
成人91免费视频| 91精品蜜臀一区二区三区在线| 国模私拍在线观看| 精品少妇人妻av免费久久洗澡| 另类高清dbsm日本tvav| 亚洲天堂狠狠干| 国产免费xxx| 男女爱爱福利视频| 欧洲亚洲精品久久久久| 色网站在线视频| 在线免费日韩av| 久久九九国产精品怡红院| 91av资源网| 精华区一区二区三区| 日韩在线播放一区| 石原莉奈一区二区三区高清在线| 精品国产乱码久久久久软件| 姬川优奈av一区二区在线电影| 国内精品视频| jizz欧美性11| 精品亚洲国产成av人片传媒| 国产人妻精品一区二区三| 亚洲欧美一区二区三区四区五区| 日本黄色片在线播放| 国产精品久久综合av爱欲tv| 日韩成人在线免费观看| 日韩精品免费一线在线观看| 欧美色视频一区二区三区在线观看| 亚洲第一精品夜夜躁人人爽| 国产成人a级片| 成人在线播放视频| 国产乱淫av片免费| 成人免费在线视频| 一区二区三区在线资源| 97久久久精品综合88久久| 天天综合视频在线观看| 男人天堂网页| 国产在线视频第一页| 五月花丁香婷婷| 视频欧美精品| 亚洲精品国产91| 看全色黄大色大片| 日韩激情一区二区| 欧美国产精品人人做人人爱| 国产精品手机播放| 成视频年人免费看黄网站| 成人精品第一区二区三区| 欧美1级片网站| 久久精品视频在线观看| 欧美激情偷拍自拍| 黄色大片中文字幕| 国产成人精品一区二区免费视频| 久久伊人资源站| 中文字幕免费一区| 青青a在线精品免费观看| 欧美精品总汇| 国产成人免费观看网站| 色婷婷国产精品免| 波波电影院一区二区三区| 国产综合久久久久影院| 韩日中文字幕| 成人午夜天堂| 日韩亚洲欧美中文高清在线| 国内精品不卡在线| 亚洲国产精品久久网午夜小说| 国产亚洲激情在线| 91在线视频播放| 岛国91视频| 国产亚洲一区二区三区在线观看| 果冻天美麻豆一区二区国产| 国产精品亚洲美女av网站| 成人久久精品人妻一区二区三区| 亚洲综合在线观看视频| 精品一区二区三区的国产在线播放| 日韩大片在线观看视频| 欧亚精品在线观看| 成人h猎奇视频网站| 成人在线免费网站| 少妇一区二区三区| 日本私人网站在线观看| 国产成人av网站| 精品国产一区在线| 欧美色道久久88综合亚洲精品| 91精品国产综合久久久久久久| 亚洲第一黄网| 加勒比成人在线| 日韩三区四区| 久久99久久99精品免观看软件| 91视频在线免费观看| 国产亚洲精品熟女国产成人| 国产亚洲欧美一区在线观看| 日韩在线视频一区| 久久久久久无码精品大片| 天天操天天干天天操天天干| 97se亚洲国产综合在线| 一本久久a久久免费精品不卡| 国产免费一区二区三区网站免费| 中文字幕1234区| 国产一区二区三区在线播放免费观看| 欧美人与牲动交xxxx| 久久久久久久久久久网站| 可以直接看的av网址站| 91黑丝在线| 黄网动漫久久久| 夜夜躁狠狠躁日日躁av| 欧美12一14sex性hd| 国产www.大片在线| 国产字幕视频一区二区| 成人黄色中文字幕| 蜜桃传媒在线| 国产精品区一区二| 中文字幕一区二区三区人妻不卡| 精品久久久久亚洲| 视频在线这里都是精品| 日韩一区二区在线免费| 一级黄色录像在线观看| 北条麻妃在线观看视频| 亚洲三区在线播放| 一区二区三区高清在线观看| 亚洲黄色片免费| 天堂中文字幕一二区| 欧美裸体在线版观看完整版| 男人天堂网站在线| 啪啪亚洲精品| 国产午夜精品理论片a级大结局| 国内精品不卡在线| 男女私大尺度视频| 国产无套内射又大又猛又粗又爽| 免费黄网站观看| 99国产高清| 国产精品午夜久久| 中出在线观看| 天堂成人在线观看| 8x国产一区二区三区精品推荐| 欧洲精品在线一区| 午夜精品在线免费观看| 欧洲大片精品免费永久看nba| 300部国产真实乱| free性中国hd国语露脸| 精品日韩视频在线观看| 久热国产精品| 国产精品黄色影片导航在线观看| 亚洲精品v日韩精品| 国产精品亚洲аv天堂网| 中文字幕永久在线| 97久久超碰精品国产| 欧美老**bbbb毛片| 欧美涩涩网站| 一本色道久久综合亚洲| 一区二区视频在线观看免费的| 青青草av在线播放| 无码人妻精品一区二区三区9厂| 国内久久久精品| 高潮白浆视频| 青青一区二区三区| 成人国产电影在线观看| 欧美成人免费在线视频| 国产精品18久久久久| 国产欧美日韩一区二区三区在线| 日韩三级中文字幕| 六月丁香综合| 欧美激情免费| 国产精品黄页网站在线播放免费| 国产伦一区二区三区| 伊人天天久久大香线蕉av色| 97人人做人人人难人人做| 成人a区在线观看| 91在线视频一区| 色婷婷亚洲综合| 亚洲精品午夜在线观看| 亚洲高清在线一区| 亚洲精品乱码久久久久久久久久久久| 欧美激情综合在线| 青青青伊人色综合久久| 93在线视频精品免费观看| 黑人玩欧美人三根一起进| 精品成人在线观看| 亚洲色欲综合一区二区三区| 一区免费观看| 久草视频免费在线播放| 欧美日韩一区二区三区视频| 国产精品9999久久久久仙踪林| 国模无码大尺度一区二区三区| 影音先锋在线资源中文字幕| 久草福利资源在线视频| 7878成人国产在线观看| 国产精品无码一区二区三区| 黑人巨大40cm重口| 宅男噜噜噜66国产精品免费| 九九这里只有精品视频| 精品99又大又爽又硬少妇毛片| 亚洲欧美日韩动漫| 青檬在线电视剧在线观看| 国产日韩欧美一区二区三区四区| 欧美人在线观看| 国产精品12| 日本天堂网在线观看| eeuss鲁片一区| 男女啪啪网站视频| 国内精品国产三级国产aⅴ久| 国产精品免费精品自在线观看| 亚洲午夜久久久久久尤物| 日日夜夜精品一区| 精品欧美日韩一区二区| 神马欧美一区二区| 久久久久无码国产精品不卡| 天堂一区二区在线免费观看| 国产女人伦码一区二区三区不卡| 日本人视频jizz页码69| 日韩在线免费高清视频| 九色视频在线观看| 成人精品网站在线观看| 成人18视频日本| 国产精品中文字幕在线| 亚洲一区在线视频| 手机在线一区二区三区| 视频区 图片区 小说区| 亚洲在线www| 免费在线观看国产黄| 久久国产99| 日日骚一区二区三区| 99久久精品网| 日韩国产高清污视频在线观看| 羞羞网www| 天堂av免费在线观看| 中文字幕在线视频久| 国产综合无码一区二区色蜜蜜| 久久本道综合色狠狠五月| 熟女熟妇伦久久影院毛片一区二区| 丝袜美腿综合| ass极品国模人体欣赏| 免费看片黄色| 午夜爱爱毛片xxxx视频免费看| 香蕉亚洲视频| 7777精品伊人久久久大香线蕉超级流畅| 久久国产加勒比精品无码| 四虎免费av| 中文字幕+乱码+中文乱码91| 亚洲 中文字幕 日韩 无码| 中文在线免费观看| 鲁大师私人影院在线观看| 国内精品国语自产拍在线观看| 日韩av一区二区在线观看| 亚洲自拍av在线| 中文字幕亚洲综合久久菠萝蜜| 一本一本久久a久久精品综合妖精| 国产乱色国产精品免费视频| 桃花岛tv亚洲品质| 三级黄在线观看| 噜噜噜在线观看播放视频| 久久亚洲国产精品| 国产色婷婷亚洲99精品小说| 成人淫片免费视频95视频| 欧美激情图区| 欧美亚洲一级二级| 国产一级视频在线观看| 黄色软件在线观看| 成人免费的视频| 天天舔天天操天天干| 巨骚激情综合| 美腿丝袜一区二区三区| 在线播放成人| 日韩在线播放视频| 91在线精品一区二区三区| 免费在线高清av| 五月天婷婷在线观看视频| 在线播放黄色av| av第一福利在线导航| 精品香蕉一区二区三区| 欧美在线一级| 伊人激情综合网| 亚洲三级一区| 国产精品美女免费看| 亚洲黄页一区| 国产福利拍拍拍| 国产美女视频91| 免费成人在线视频网站| 永久免费毛片在线观看| 在线香蕉视频| 亚洲第一会所| 亚洲丝袜精品丝袜在线| 91精品在线观看国产| 深夜福利影院在线观看| 91中文字幕| 国产拍揄自揄精品视频麻豆| 亚洲热线99精品视频| 日韩精品分区| 欧美日韩福利在线| 一区二区三区国产免费| 伊人国产在线观看| 欧美日韩亚洲系列| 久久久亚洲av波多野结衣| 国产精品福利电影| 欧美高清电影在线看| 国内欧美视频一区二区| 亚洲成人1区2区| 免费观看国产精品| jizz亚洲少妇| 国产超级va在线视频| 国产一区玩具在线观看| 国产成人精品亚洲| 无码国产69精品久久久久网站| 91黄页在线观看| 青青久久aⅴ北条麻妃| 欧美特黄一级视频| 福利一区二区| 亚洲三级小视频| 国内自拍欧美激情| 在线成人www免费观看视频| 国产白浆在线观看| 亚洲国产精品福利| 欧美一二区在线观看| 福利视频导航网| 中文字幕一区日韩电影| 日本免费在线观看| 精品国产免费久久久久久婷婷| 国产精品.com| 亚洲狠狠婷婷综合久久久久图片| 日韩一级片一区二区| 国产精品成人久久久久| 精品亚洲视频在线| 中文字幕超清在线免费观看| 日b视频在线观看| 色姑娘资源站| 影视先锋av资源站| 精品国产一区二区三区在线| 免费三级欧美电影| 国产激情偷乱视频一区二区三区|