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

首頁 > 系統 > Android > 正文

解析Android開發優化之:對Bitmap的內存優化詳解

2020-04-11 12:25:44
字體:
來源:轉載
供稿:網友


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的示例代碼片段。

復制代碼 代碼如下:

// 先判斷是否已經回收

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

        // 回收并且置為null

        bitmap.recycle(); 

        bitmap = null; 

System.gc();


從上面的代碼可以看到,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異常進行捕獲。

以下是代碼示例。

復制代碼 代碼如下:

Bitmap bitmap = null;

try {

    // 實例化Bitmap

    bitmap = BitmapFactory.decodeFile(path);

} catch (OutOfMemoryError e) {

    //

}

if (bitmap == null) {

    // 如果實例化失敗 返回默認的Bitmap對象

    return defaultBitmapMap;

}


這里對初始化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。通過這兩個值,就可以知道圖片是否過大了。

復制代碼 代碼如下:

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

    // 設置inJustDecodeBounds為true

    opts.inJustDecodeBounds = true;

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

    BitmapFactory.decodeFile(path, opts);

    // 打印出圖片的寬和高

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


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

經驗分享:

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美aaa| 成人黄在线观看| 国产精品男人的天堂| 欧美性在线视频| 亚洲剧情一区二区| 日韩av片永久免费网站| 亚洲最大福利视频网站| 国产精品视频网| 人九九综合九九宗合| 国产成人精品午夜| 不卡中文字幕av| 国产精品热视频| 97久久精品人搡人人玩| 欧美成aaa人片在线观看蜜臀| 欧美一区二区大胆人体摄影专业网站| 日本高清不卡在线| 色黄久久久久久| 亚洲国产天堂久久国产91| 久久久av亚洲男天堂| 成人中文字幕+乱码+中文字幕| yellow中文字幕久久| 欧美成人免费在线观看| 3344国产精品免费看| 青青在线视频一区二区三区| 疯狂欧美牲乱大交777| 日韩二区三区在线| 亚洲欧美日韩精品久久亚洲区| 日韩在线视频国产| 日韩av综合网| 精品无人区乱码1区2区3区在线| 欧美日韩免费在线| 久久天堂av综合合色| 中文字幕亚洲一区| 久久久久久久久久久av| 亚洲欧美日韩区| 国内精品国产三级国产在线专| 亚洲欧美国产精品专区久久| 国产精品毛片a∨一区二区三区|国| 中文字幕久久亚洲| 福利一区福利二区微拍刺激| 一区二区三区日韩在线| 亚洲精品视频播放| 久久精品国产一区| 欧美激情视频播放| 中文字幕日韩精品在线观看| 欧美性xxxx极品高清hd直播| 91老司机精品视频| 日本午夜在线亚洲.国产| 国内精品一区二区三区四区| 久久人人97超碰精品888| 亚洲一区二区久久久久久| 成人在线观看视频网站| 亚洲欧美日韩精品久久奇米色影视| 精品国产乱码久久久久久婷婷| 日韩有码视频在线| 久久中文字幕在线| 精品成人国产在线观看男人呻吟| 人人澡人人澡人人看欧美| 欧美性精品220| 日韩亚洲成人av在线| 久久久精品久久久久| 日韩精品中文字幕在线播放| 亚洲视频视频在线| 亚洲欧美制服另类日韩| 日本一欧美一欧美一亚洲视频| 久久香蕉国产线看观看网| www日韩欧美| 日韩av免费看| 亚洲综合第一页| 国产中文欧美精品| 97在线精品国自产拍中文| 久久全球大尺度高清视频| 激情亚洲一区二区三区四区| 日韩av在线一区| 大胆欧美人体视频| 成人啪啪免费看| 日韩亚洲欧美成人| 欧美风情在线观看| 国产精品第8页| 欧美大尺度激情区在线播放| 中文字幕亚洲一区| 亚洲美女在线视频| 亚洲成成品网站| 成人黄色短视频在线观看| 欧美日韩美女在线观看| 日韩经典一区二区三区| 国产精品永久免费视频| 欧美色视频日本高清在线观看| 日韩成人av网址| 精品美女久久久久久免费| 国产脚交av在线一区二区| 午夜精品蜜臀一区二区三区免费| 亚洲一二三在线| 亚洲精品动漫100p| 亚洲成人免费网站| 久久99国产综合精品女同| 中文字幕欧美日韩在线| 亚洲天堂av女优| 亚洲资源在线看| 国产免费一区视频观看免费| 国产精品2018| 久国内精品在线| 日韩精品视频在线播放| 美女福利精品视频| 久久精品国产视频| 性日韩欧美在线视频| 国自产精品手机在线观看视频| 精品国产乱码久久久久酒店| 久久九九免费视频| 亚洲欧美在线看| 久久全国免费视频| 久久久免费高清电视剧观看| 国产福利精品av综合导导航| 久久精品国产综合| 色爱精品视频一区| 91久久精品一区| 欧美大片在线看免费观看| 欧美成人一区二区三区电影| 欧美精品少妇videofree| 成人网在线视频| 日韩一区二区三区xxxx| 久久久精品电影| 国产精品美女无圣光视频| 日韩在线观看你懂的| 色婷婷综合久久久久中文字幕1| 狠狠久久五月精品中文字幕| 亚洲2020天天堂在线观看| 亚洲美女福利视频网站| 亚洲嫩模很污视频| 98视频在线噜噜噜国产| 色中色综合影院手机版在线观看| 欧美激情精品在线| 九九热这里只有精品6| 亚洲天堂一区二区三区| 日韩欧美国产激情| 亚洲人成在线观看网站高清| 91精品国产高清| 91亚洲人电影| 中文字幕自拍vr一区二区三区| 亚洲大胆人体av| 97精品国产91久久久久久| 亚洲iv一区二区三区| 欧美性极品xxxx娇小| 亚洲自拍小视频| 美女精品视频一区| 色偷偷噜噜噜亚洲男人的天堂| 国产视频精品久久久| 亚洲精品美女在线观看| 高清欧美性猛交xxxx| 久久久亚洲欧洲日产国码aⅴ| 国产成人精品日本亚洲| 日韩在线精品一区| 欧美成人中文字幕在线| 亚洲国产成人爱av在线播放| 欧美黑人xxxx| 国产精品久久久久久久久久小说| 亚洲精品中文字幕av| 亚洲成人1234| 欧美日韩国产影院| 久久精品精品电影网| 日韩欧美第一页| 国产视频丨精品|在线观看| 久久精品99久久久香蕉| 欧美国产精品日韩|