欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android Bitmap的加載與緩存

 更新時(shí)間:2018年03月26日 17:14:17   作者:mmmmar  
這篇文章主要介紹了Android Bitmap的加載與緩存的相關(guān)資料,需要的朋友可以參考下

Android系統(tǒng)中圖片一般用Bitmap對(duì)象表示,它支持png,jpg等常見(jiàn)格式。通常情況下圖片的體積都比較大,單個(gè)應(yīng)用允許使用的內(nèi)存又是有限的,所以我們需要采取一些手段減少內(nèi)存占用并提高加載速度。

1、圖片加載

SDK提供了BitmapFactory類供我們加載圖片,常用的方法有這么幾個(gè):

  •  BitmapFactory.decodeFile :從文件加載。
  •  BitmapFactory.decodeByteArray :從字節(jié)數(shù)組加載。
  •  BitmapFactory.decodeStream :從輸入流加載。
  •  BitmapFactory.decodeResource :從資源文件加載。

假設(shè)我們用ImageView顯示圖片,通常它的尺寸要比圖片的尺寸小很多,那么把圖片整個(gè)加載進(jìn)內(nèi)存顯然是沒(méi)有必要的。在圖形學(xué)上有個(gè)名詞叫“下采樣”,作用就是降低圖像的分辨率,使其符合顯示區(qū)域的大小。通過(guò)BitmapFactory.Options類,我們也可以實(shí)現(xiàn)同樣的功能。這里主要用到了它的 inSampleSize 參數(shù),如果它的值是1,那么采樣后的圖片跟原圖一致,如果是2,那么采樣后的圖片長(zhǎng)和寬都是原來(lái)的一半,占用的內(nèi)存也就是原來(lái)的四分之一。

public static Bitmap decodeSampleBitmapFromBytes(byte[] data) {
  final BitmapFactory.Options options = new BitmapFactory.Options();
  // inJustDecodeBounds為true時(shí)僅解析圖片原始信息,并不會(huì)真正加載圖片。
  options.inJustDecodeBounds = true;
  BitmapFactory.decodeByteArray(data, 0, data.length, options);
  // 此時(shí)圖片的寬高可以通過(guò)options.outWidth和options.outHeight獲取到,我們
  // 可以根據(jù)自己的需求計(jì)算出采樣比。
  options.inSampleSize = 1;
  // inJustDecodeBounds設(shè)置為fales,加載圖片到內(nèi)存中。
  options.inJustDecodeBounds = false;
  return BitmapFactory.decodeResource(res, resId, options);
}

2、圖片緩存

緩存在計(jì)算機(jī)領(lǐng)域使用非常廣泛,如HTTP緩存,DNS緩存等等,緩存既可以提高響應(yīng)速度,又能節(jié)省服務(wù)器帶寬,在圖片加載上它同樣適用。Android開(kāi)發(fā)中一般會(huì)對(duì)圖片做兩級(jí)緩存:內(nèi)存緩存和文件緩存,而且它們都有庫(kù)供我們使用,分別是LruCache和DiskLruCache。從名字就可以看出兩者都使用了LRU算法,即優(yōu)先淘汰那些近期最少使用的緩存。

2.1、LruCache

LruCache是Android提供的一個(gè)緩存類,一般用來(lái)管理內(nèi)存緩存。

// #1:確定緩存大小。
int maxMemory = (int)(Runtime.getRuntime().totalMemory() / 1024);
int cacheSize = maxMemory / 8;
// #2:重寫(xiě)sizeOf方法計(jì)算每個(gè)緩存對(duì)象的內(nèi)存占用。
LruCache<String, Bitmap> mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {
  @Override
  protected int sizeOf(String key, Bitmap value) {
    return value.getByteCount();
  }
};

LruCache是一個(gè)泛型類可以容納各種對(duì)象,因而它無(wú)法計(jì)算被儲(chǔ)存對(duì)象的大小,所以我們需要重寫(xiě)它的 sizeOf 方法,手動(dòng)進(jìn)行計(jì)算。那LruCache是如何實(shí)現(xiàn)的呢,實(shí)際上它僅僅是對(duì)LinkedHashMap進(jìn)行了封裝并處理了線程安全問(wèn)題。LinkedHashMap的構(gòu)造函數(shù)中有一個(gè)布爾類型的參數(shù), accessOrder ,當(dāng)它為 true 時(shí)元素按訪問(wèn)順序存儲(chǔ),為 false 時(shí)按插入順序存儲(chǔ)。當(dāng)元素按訪問(wèn)順序存儲(chǔ)時(shí)在其尾部取出的元素也就是最近最少使用的元素,也就實(shí)現(xiàn)了LRU算法。LruCache只需要每次 put 函數(shù)被調(diào)用后計(jì)算當(dāng)前總緩存的大小,當(dāng)其超出門限值時(shí)移除位于LinkedHashMap尾部的元素即可。

2.2、DiskLruCache

DiskLruCache同LruCache一樣都使用LinkedHashMap實(shí)現(xiàn)LRU算法,但DiskLruCache在實(shí)現(xiàn)和使用上更復(fù)雜一些,畢竟需要對(duì)文件進(jìn)行管理。

獲得DiskLruCache對(duì)象需要調(diào)用 DiskLruCache.open 函數(shù):

public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)

它接收4個(gè)參數(shù),第一個(gè)是緩存區(qū)目錄,第二個(gè)是客戶端版本號(hào),DiskLruCache認(rèn)為當(dāng)版本號(hào)發(fā)生變化時(shí)緩存是無(wú)效的,第三個(gè)參數(shù)代表每個(gè)鍵可以關(guān)聯(lián)幾個(gè)文件,最后一個(gè)參數(shù)指定的緩存區(qū)的大小。在創(chuàng)建對(duì)象時(shí),DiskLruCache會(huì)根據(jù)緩沖區(qū)目錄下名為“journal”的日志文件在LinkedHashMap中為緩存文件建立索引,所有對(duì)緩沖區(qū)的操作都會(huì)被記錄在這個(gè)文件中。當(dāng)緩沖區(qū)大小到達(dá)門限值后根據(jù)LRU算法對(duì)文件進(jìn)行清理。

讀取緩存時(shí)使用 DiskLruCache.get 函數(shù):

public synchronized Snapshot get(String key) throws IOException

函數(shù)返回一個(gè)Snapshot對(duì)象,通過(guò)該對(duì)象我們可以獲取到緩存文件的輸入流,多個(gè)線程可以同時(shí)使用各自的SnapShot對(duì)象讀取同一個(gè)Key對(duì)應(yīng)的緩存。

操作緩存時(shí)使用 DiskLruCache.edit 函數(shù):

public Editor edit(String key) throws IOException

創(chuàng)建或更改完畢后用 Editor.commit 函數(shù)提交或用 Editor.abort 函數(shù)取消。一個(gè)Key對(duì)應(yīng)的緩存被操作時(shí)仍可以使用Snapshot對(duì)象讀取其內(nèi)容,因?yàn)镋ditor的所有操作都會(huì)先作用于臨時(shí)文件。注意每個(gè)Key只能同時(shí)獲取一個(gè)Editor對(duì)象,也就是說(shuō)即使Editor沒(méi)有做任何操作也要調(diào)用 Editor.abort 或  Editor.commit 函數(shù),不然再次獲取時(shí)函數(shù)返回 null 。

2.3、代碼示例

public Bitmap loadBitmap(String url) {
  // DiskLruCache要求鍵中不能含有特殊字符,所以
  // 一般先做哈希處理。
  String key = MD5(url);
  Bitmap bitmap = loadBitmapFromMemCache(key);
  if (bitmap != null) {
    return bitmap;
  }
  try {
    bitmap = loadBitmapFromDiskCache(key);
    if (bitmap != null) {
      return bitmap;
    }
    bitmap = loadBitmapFromHttp(url);
    if (bitmap != null) {
      return bitmap;
    }
  } catch (IOException e) {
    e.printStackTrace();
  }
  return null;
}

在 loadBitmapFromHttp 函數(shù)中需要將圖片資源放入DiskLruCache中,在 loadBitmapFromDiskCache 函數(shù)中將加載后的Bitmap對(duì)象放入LruCache中,如此便形成了一條緩存鏈。

總結(jié)

以上所述是小編給大家介紹的Android Bitmap的加載與緩存,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 初識(shí)Android?PowerManagerService省電模式

    初識(shí)Android?PowerManagerService省電模式

    這篇文章主要介紹了初識(shí)Android?PowerManagerService省電模式,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-08-08
  • 一步步教你寫(xiě)Slack的Loading動(dòng)畫(huà)

    一步步教你寫(xiě)Slack的Loading動(dòng)畫(huà)

    這篇文章主要為大家詳細(xì)手摸手教你寫(xiě)Slack的Loading動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Android中Fab(FloatingActionButton)實(shí)現(xiàn)上下滑動(dòng)的漸變效果

    Android中Fab(FloatingActionButton)實(shí)現(xiàn)上下滑動(dòng)的漸變效果

    這篇文章主要給大家介紹了Android中FloatingActionButton(簡(jiǎn)稱FAB)是如何實(shí)現(xiàn)上下滑動(dòng)的漸變效果,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們可以一起看看吧。
    2017-02-02
  • Android使用硬件加速的方式

    Android使用硬件加速的方式

    硬件加速是指利用設(shè)備的硬件資源來(lái)加速圖形渲染和圖像處理等操作,以提高應(yīng)用程序的性能和用戶體驗(yàn),Android使用硬件加速的目的是為了提高圖形渲染的性能和效果,本文給大家詳細(xì)介紹了Android如何使用硬件加速,需要的朋友可以參考下
    2023-10-10
  • android Matrix實(shí)現(xiàn)圖片隨意放大縮小或拖動(dòng)

    android Matrix實(shí)現(xiàn)圖片隨意放大縮小或拖動(dòng)

    這篇文章主要為大家詳細(xì)介紹了android Matrix實(shí)現(xiàn)圖片隨意放大縮小或拖動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路

    Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路

    本文通過(guò)實(shí)例代碼給大家講解了Android 在viewPager中雙指縮放圖片雙擊縮放圖片單指拖拽圖片的實(shí)現(xiàn)思路及解決方案,需要的朋友參考下吧
    2017-05-05
  • Android仿抖音右滑清屏左滑列表功能的實(shí)現(xiàn)代碼

    Android仿抖音右滑清屏左滑列表功能的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Android仿抖音右滑清屏左滑列表功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • Android性能優(yōu)化之弱網(wǎng)優(yōu)化詳解

    Android性能優(yōu)化之弱網(wǎng)優(yōu)化詳解

    這篇文章主要為大家介紹了Android性能優(yōu)化之弱網(wǎng)優(yōu)化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • android 分辨率適配的方法

    android 分辨率適配的方法

    先和大家分享下,這個(gè)方法不能說(shuō)萬(wàn)能的,但是最起碼它解決了分辨率跟密集度的關(guān)系,但是也引來(lái)一個(gè)問(wèn)題,就是布局會(huì)因?yàn)閳D片資源小而失真,本文將詳細(xì)介紹android 分辨率適配的方法,需要的朋友可以參考下
    2012-11-11
  • Android開(kāi)發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法

    Android開(kāi)發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法

    這篇文章主要介紹了Android開(kāi)發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法,結(jié)合實(shí)例形式分析了Android自定義view繪制圓角矩形的相關(guān)方法與使用技巧,需要的朋友可以參考下
    2017-10-10

最新評(píng)論