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

首頁 > 系統 > Android > 正文

Android 中對于圖片的內存優化方法

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

1. 對圖片本身進行操作

盡量不要使用 setImageBitmap、setImageResource、 BitmapFactory.decodeResource 來設置一張大圖,因為這些方法在完成 decode 后,最終都是通過 Java 層的 createBitmap 來完成的,需要消耗更多內存。因此,改用先通過 BitmapFactory.decodeStream 方法,創建出一個 bitmap,再將其設為 ImageView 的 source,decodeStream 最大的秘密在于其直接調用 JNI>>nativeDecodeAsset() 來完成 decode,無需再使用 Java 層的 createBitmap,從而節省了 Java 層的空間。如果在讀取時加上圖片的 Config 參數,可以更有效的減少加載的內存,從而更有效阻止拋出內存異常。另外,decodeStream 直接拿圖片來讀取字節碼了,不會根據機器的各種分辨率來自動適應,使用了 decodeStream 之后,需要在 hdpi 和 mdpi,ldpi 中配置相應的圖片資源, 否則在不同分辨率機器上都是同樣大?。ㄏ袼攸c數量),顯示出來的大小就不對了。

復制代碼 代碼如下:

InputStream is = this.getResources().openRawResource(R.drawable.pic);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = false;
options.inSampleSize = 2;
Bitmap btp =BitmapFactory.decodeStream(is,null,options);

以上代碼即是讀取 drawable 下名為 pic 圖片的縮略圖,長度、寬度都只有原圖片的 1/2。圖片大小減少,占用的內存自然也變小了。這么做的弊端是圖片質量變差,inSampleSize 的值越大,圖片的質量就越差。由于各手機廠商縮放圖片的算法不同,在不同手機上的縮放圖片質量可能會不同。

2. 調用圖片的 recycle() 方法

復制代碼 代碼如下:

if(!bmp.isRecycle() ){
   bmp.recycle()    //回收圖片所占的內存
   system.gc()      //提醒系統及時回收
}

這種方法其實不是真正降低圖片內存的方法。主要目的是標記圖片對象,方便回收圖片對象的本地數據。圖片對象的本地數據占用的內存最大,而且與程序 Java 部分的內存是分開計算的。所以經常出現 Java heap 足夠使用,而圖片發生 OutOfMemoryError 的情況。在圖片不使用時調用該方法,可以有效降低圖片本地數據的峰值,從而減少 OutOfMemoryError 的概率。不過調用了 recycle() 的圖片對象處于“廢棄”狀態,調用時會造成程序錯誤。所以在無法保證該圖片對象絕對不會被再次調用的情況下,不建議使用該方法。特別要注意已經用 setImageBitmap(Bitmap
img) 方法分配給控件的圖片對象,可能會被系統類庫調用,造成程序錯誤。

 

3. 以最省內存的方式讀取本地資源的圖片

復制代碼 代碼如下:

/**
 * 以最省內存的方式讀取本地資源的圖片
 */
public static Bitmap readBitMap(Context context, int resId){ 
   BitmapFactory.Options opt = new BitmapFactory.Options(); 
   opt.inPreferredConfig = Bitmap.Config.RGB_565; 
   opt.inPurgeable = true; 
   opt.inInputShareable = true; 
   // 獲取資源圖片 
   InputStream is = context.getResources().openRawResource(resId); 
   return BitmapFactory.decodeStream(is,null,opt); 
}

Android 中加載圖片的顏色模式有四種,分別是:ALPHA_8:每個像素占用 1byte 內存、ARGB_4444:每個像素占用 2byte 內存、ARGB_8888:每個像素占用 4byte 內存、RGB_565:每個像素占用 2byte 內存。Android默認的顏色模式為ARGB_8888,這個顏色模式色彩最細膩,顯示質量最高。但同樣的,占用的內存也最大。以上代碼即是將圖片資源以 RGB_565 (或以 ARGB_4444)模式讀出。內存減少雖然不如第一種方法明顯,但是對于大多數圖片,看不出與 ARGB_8888 模式有什么差別。不過在讀取有漸變效果的圖片時,可能有顏色條出現。另外,會影響圖片的特效處理。

 

4. 使用 Matrix 對象放大的圖片如何更改顏色模式:

雖然使用 Matrix 對象放大圖片,必定會耗費更多的內存,但有時候也不得不這樣做。放大后的圖片使用的 ARGB_8888 顏色模式,就算原圖片是ARGB_4444 顏色模式也一樣,而且沒有辦法在放大時直接指定顏色模式??梢圆捎靡韵罗k法更改圖片顏色模式。

復制代碼 代碼如下:

Matrix matrix = new Matrix();
float newWidth = 200;       // 圖片放大后的寬度
float newHeight = 300;      // 圖片放大后的長度
matrix.postScale(newWidth / img.getWidth(), newHeight/ img.getHeight());
Bitmap img1 = Bitmap.createBitmap(img, 0, 0, img.getWidth(), img.getHeight(), matrix, true);// 得到放大圖片
img2 = img1.copy(Bitmap.Config.ARGB_4444, false);                           // 得到 ARGB_4444 顏色模式的圖片
img = null;
img1 = null;

這里比起本來的圖片額外生成了一個圖片對象 img1。然則體系會主動收受接管 img1,所以實際內存還是削減了。

歸結起來還是以縮略圖模式讀取圖片和削減圖片中每個像素占用的內存最為有效。 這兩種辦法固然有效,然則也有各自的弊病。實際開辟中還是應當按照景象酌情應用。最王道的辦法,還是避免垃圾對象的產生。例如在 ListView 的應用中,復用 convertView 等。若是應用 AsyncTask 加載圖片,要及時將引用的 ImageView 對象置為 null。因為 AsyncTask 是用線程池實現的,所以此中引用的對象可能會擁有很長的生命周期,造成 GC 無法開釋。我還是信賴 Android 的內存收受接管機制的,recycle 什么的固然必然程度上有效,但總感覺不合適 Java 內存收受接管的原則。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲欧美国产一本综合首页| 成人免费视频网| 日韩亚洲第一页| 国产精品视频永久免费播放| 欧美洲成人男女午夜视频| 久久久久九九九九| 亚洲成人动漫在线播放| 91色在线视频| 欧美精品一区在线播放| 国模叶桐国产精品一区| 日韩av综合中文字幕| 国产成人自拍视频在线观看| 一区三区二区视频| 韩国精品久久久999| 国自在线精品视频| 久久久精品免费视频| 川上优av一区二区线观看| 日韩av一区二区在线观看| 日韩高清av一区二区三区| 亚洲国产精品热久久| 国产成人短视频| 欧美激情手机在线视频| 久久精品国产成人| 日韩中文字幕国产精品| 久久久久久久一区二区三区| 亚洲乱码国产乱码精品精天堂| 国产精品久久久久久久久久久新郎| 日韩av在线播放资源| 亚洲欧美日韩一区在线| 亚洲影影院av| 韩国三级电影久久久久久| 国产精品久久网| 国产婷婷97碰碰久久人人蜜臀| 国模私拍一区二区三区| 久久久99久久精品女同性| 91在线免费观看网站| 国产精品av在线| 日韩有码片在线观看| 国产精品入口日韩视频大尺度| 国产精品自拍视频| 日韩成人av在线| 在线观看日韩www视频免费| 在线观看视频99| 亚洲石原莉奈一区二区在线观看| 欧美激情精品久久久久久免费印度| 国产福利精品av综合导导航| 蜜臀久久99精品久久久无需会员| 精品久久久久久久久久久久久久| 欧美视频在线免费看| 欧美国产精品人人做人人爱| 亚洲电影免费观看高清| 亚洲第一福利网| 亚洲在线观看视频网站| 亚洲欧洲一区二区三区久久| 国产精品久久久久久av福利| 成人动漫网站在线观看| 亚洲人成亚洲人成在线观看| 日本高清不卡在线| 亚洲精品国产品国语在线| 欧美精品一区三区| 亚洲无限乱码一二三四麻| 国产精品精品视频一区二区三区| 2020久久国产精品| 日韩国产高清视频在线| 精品成人乱色一区二区| 午夜精品视频网站| 国产91网红主播在线观看| 性亚洲最疯狂xxxx高清| 九九久久综合网站| 欧美亚洲一级片| 亚洲最大的免费| 国产精品999| 91精品国产高清自在线| 亚洲成人网av| 久久精品男人天堂| 亚洲精品一区av在线播放| 欧美成人精品一区二区| 中文日韩在线视频| 69久久夜色精品国产7777| 91黑丝高跟在线| 一本一本久久a久久精品牛牛影视| 色偷偷88888欧美精品久久久| 亚洲欧美激情一区| 久久99亚洲精品| 欧美亚洲激情视频| 精品久久久久久久久久国产| 国产精品99久久久久久www| 久久久亚洲国产| 久久精品视频在线播放| 国产精品三级久久久久久电影| 成人精品视频久久久久| 日韩va亚洲va欧洲va国产| 欧美激情第三页| 91豆花精品一区| 午夜精品视频网站| 九九热这里只有在线精品视| 国产精品电影一区| 国模私拍一区二区三区| 欧美性xxxxx极品| 狠狠久久五月精品中文字幕| 精品国产一区二区三区久久狼黑人| 69久久夜色精品国产7777| 欧美乱人伦中文字幕在线| 狠狠躁天天躁日日躁欧美| 亚洲国产精品久久精品怡红院| 欧美精品生活片| 久久久av免费| 久久夜色精品国产| 26uuu另类亚洲欧美日本老年| 亚洲精品免费网站| 欧美xxxx18性欧美| 国产亚洲精品久久久久久777| 欧美激情在线观看视频| 免费99精品国产自在在线| 国产大片精品免费永久看nba| 成人有码视频在线播放| 欧美激情久久久久久| 精品久久久久久中文字幕一区奶水| 欧美视频免费在线| 欧美国产日韩一区二区三区| 97久久久久久| 成人美女免费网站视频| 久久亚洲欧美日韩精品专区| 久久影视电视剧免费网站清宫辞电视| 国产精品丝袜一区二区三区| 国产精品久久久久久久久影视| 欧美精品久久久久久久久久| 永久免费精品影视网站| 午夜伦理精品一区| 欧洲日韩成人av| www.日韩不卡电影av| 亚洲白拍色综合图区| 亚洲精品wwwww| 蜜臀久久99精品久久久久久宅男| 亚洲欧美日韩精品| 亚洲午夜精品久久久久久性色| 国产精品毛片a∨一区二区三区|国| 久久香蕉精品香蕉| 538国产精品一区二区在线| 欧美精品日韩www.p站| 欧美性在线视频| 久久久中精品2020中文| 久久69精品久久久久久国产越南| 成人a级免费视频| 国内外成人免费激情在线视频网站| 国产精品自产拍在线观| 国内精久久久久久久久久人| 欧美区在线播放| 91精品国产色综合| 九九热视频这里只有精品| 欧美在线视频在线播放完整版免费观看| 日韩视频免费看| 亚洲天堂av图片| 亚洲欧美制服另类日韩| 精品久久久久久亚洲精品| 国产精品7m视频| 亚洲第一福利在线观看| 欧美另类极品videosbestfree| 成人亚洲综合色就1024| 正在播放亚洲1区| 91成人性视频| 久久91精品国产91久久跳| 亚洲va国产va天堂va久久| 亚洲精品美女久久|