最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android 中對于圖片的內(nèi)存優(yōu)化方法

 更新時間:2013年03月14日 23:14:26   作者:  
Android 中對于圖片的內(nèi)存優(yōu)化方法,需要的朋友可以參考一下

1. 對圖片本身進(jìn)行操作

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

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

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。圖片大小減少,占用的內(nèi)存自然也變小了。這么做的弊端是圖片質(zhì)量變差,inSampleSize 的值越大,圖片的質(zhì)量就越差。由于各手機廠商縮放圖片的算法不同,在不同手機上的縮放圖片質(zhì)量可能會不同。

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

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

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

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

 

3. 以最省內(nèi)存的方式讀取本地資源的圖片

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

/**
 * 以最省內(nèi)存的方式讀取本地資源的圖片
 */
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 內(nèi)存、ARGB_4444:每個像素占用 2byte 內(nèi)存、ARGB_8888:每個像素占用 4byte 內(nèi)存、RGB_565:每個像素占用 2byte 內(nèi)存。Android默認(rèn)的顏色模式為ARGB_8888,這個顏色模式色彩最細(xì)膩,顯示質(zhì)量最高。但同樣的,占用的內(nèi)存也最大。以上代碼即是將圖片資源以 RGB_565 (或以 ARGB_4444)模式讀出。內(nèi)存減少雖然不如第一種方法明顯,但是對于大多數(shù)圖片,看不出與 ARGB_8888 模式有什么差別。不過在讀取有漸變效果的圖片時,可能有顏色條出現(xiàn)。另外,會影響圖片的特效處理。

 

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

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

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

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,所以實際內(nèi)存還是削減了。

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

相關(guān)文章

  • Android strings.xml使用方法及技巧

    Android strings.xml使用方法及技巧

    本文主要介紹Android strings.xml,這里對strings.xml文件的使用和一些小技巧做了總結(jié),有興趣的同學(xué)可以看下
    2016-08-08
  • Android源代碼倉庫及其管理工具Repo分析詳解

    Android源代碼倉庫及其管理工具Repo分析詳解

    本篇文章主要介紹了Android源代碼倉庫及其管理工具Repo分析詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Android的HTTP類庫Volley入門學(xué)習(xí)教程

    Android的HTTP類庫Volley入門學(xué)習(xí)教程

    這篇文章主要介紹了Android應(yīng)用開發(fā)框架Volley的入門學(xué)習(xí)教程,Volley適合于輕量級的通信功能開發(fā),善于處理JSON對象,需要的朋友可以參考下
    2016-02-02
  • Android開發(fā)之自定義星星評分控件RatingBar用法示例

    Android開發(fā)之自定義星星評分控件RatingBar用法示例

    這篇文章主要介紹了Android開發(fā)之自定義星星評分控件RatingBar用法,結(jié)合具體實例形式分析了Android自定義評分控件的具體實現(xiàn)步驟以及功能、布局相關(guān)操作技巧,需要的朋友可以參考下
    2019-03-03
  • Android如何使用正則表達(dá)式只保留字母數(shù)字

    Android如何使用正則表達(dá)式只保留字母數(shù)字

    在做項目的過程中,使用正則表達(dá)式來匹配一段文本中的特定種類字符,是比較常用的一種方式,下面這篇文章主要給大家介紹了關(guān)于Android如何使用正則表達(dá)式只保留字母數(shù)字的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 一文帶你了解Android?Flutter中Transform的使用

    一文帶你了解Android?Flutter中Transform的使用

    flutter的強大之處在于,可以對所有的widget進(jìn)行Transform,因此可以做出非常酷炫的效果。本文就來大家了解一下Transform的具體使用,感興趣的可以了解一下
    2023-01-01
  • Android 斷點下載和自動安裝的示例代碼

    Android 斷點下載和自動安裝的示例代碼

    本篇文章主要介紹了Android斷點下載和自動安裝的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • 關(guān)于RxJava的一些特殊用法小結(jié)

    關(guān)于RxJava的一些特殊用法小結(jié)

    RxJava 是一個響應(yīng)式編程框架,采用觀察者設(shè)計模式。下面這篇文章主要總結(jié)介紹了一些關(guān)于RxJava的特殊用法,需要的朋友可以參考借鑒,下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)吧。
    2017-05-05
  • Android開發(fā)解決字符對齊問題方法

    Android開發(fā)解決字符對齊問題方法

    這篇文章主要為大家介紹了Android開發(fā)解決字符對齊問題方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Android之Gallery使用例子

    Android之Gallery使用例子

    本篇文章主要介紹了Android之Gallery使用例子,Gallery用來顯示圖片列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01

最新評論

乌兰浩特市| 霍城县| 明水县| 翁牛特旗| 贵州省| 三亚市| 丘北县| 桂东县| 咸宁市| 无棣县| 镇平县| 阳东县| 文水县| 金昌市| 凭祥市| 昭平县| 丹江口市| 达拉特旗| 康乐县| 临朐县| 迭部县| 乌兰浩特市| 富锦市| 灯塔市| 成都市| 沛县| 平湖市| 临潭县| 松阳县| 修武县| 九龙城区| 克山县| 江安县| 乌兰浩特市| 宜宾县| 黄浦区| 呈贡县| 乡城县| 塘沽区| 漾濞| 武义县|