詳細講解Android的圖片下載架構UniversialImageLoader之磁碟緩衝(一)

來源:互聯網
上載者:User

標籤:android   blog   io   ar   os   sp   java   for   檔案   


    沉浸在Android的開發世界中有一些年頭的猴子們,估計都能夠深深的體會到Android中的圖片下載、展示、緩衝一直是心中抹不去的痛。鄙人亦是如此。Ok,閑話不說,為了督促自己的學習,下面就逐一的挖掘Android中還算是比較牛叉的圖片處理架構UniversialImageLoader以饗讀者吧!

   凡事如果過於草率必將陷入泥塘不能自拔。還是按部就班的一步一步的將這個架構給啃透。

   第一個要講的是磁碟的緩衝的介面DiskCache

   首先看一下其中的核心的介面的代碼:

  

File getDirectory();File get(String imageUri);boolean save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener) throws IOException;boolean save(String imageUri, Bitmap bitmap) throws IOException;boolean remove(String imageUri);void close();void clear();

 通過以上的代碼,發現磁碟緩衝的介面無非是包含這個幾方面的內容

 1、擷取當前的磁碟緩衝的根目錄

2、通過指定的圖片的uri來擷取當前的圖片緩衝所對應的實體的檔案

3、將檔案流儲存到磁碟中,其中對應的參數包括:1、uri2、檔案的流 3、當前的流寫入的進度與狀態的觀察者

4、儲存Bitmap的視圖的對象到磁碟中

5、有緩衝圖片就必然有刪除圖圖片檔案,就如同有陰就有陽一樣,刪除圖片的參數是uri

6、關閉當前的磁碟的流,釋放操作的時候所建立的相關的資源

7、最後一個就是清除磁碟緩衝


  第二個要講的就是實現磁碟緩衝的介面的類了。在這一講裡面主要是要關注3個類。分別是:BasicDiskCache、LimitedAgeDiskCache與UnLimitedAgeDiskCache。

  咱們還是按照邏輯的順序來先分析一下實現磁碟緩衝的抽象類別BasicDiskCache。

  為了精簡一下,先分析其中的成員變數,相信對其中的臨時變數的講解也是可以對其整體的功能進行瞭解。

 

public static final int DEFAULT_BUFFER_SIZE = 32 * 1024; // 32 Kbpublic static final Bitmap.CompressFormat DEFAULT_COMPRESS_FORMAT = Bitmap.CompressFormat.PNG;public static final int DEFAULT_COMPRESS_QUALITY = 100;private static final String ERROR_ARG_NULL = " argument must be not null";private static final String TEMP_IMAGE_POSTFIX = ".tmp";protected final File cacheDir;protected final File reserveCacheDir;protected final FileNameGenerator fileNameGenerator;protected int bufferSize = DEFAULT_BUFFER_SIZE;protected Bitmap.CompressFormat compressFormat = DEFAULT_COMPRESS_FORMAT;protected int compressQuality = DEFAULT_COMPRESS_QUALITY;

   也就是說其成員變數是:1、預設的緩衝區的尺寸 2、預設的圖片的壓縮的格式是PNG 3、預設的壓縮的品質是100 4、包括臨時的圖片檔案的緩衝的命名 5、快取檔案的目錄 6、緩衝的檔案的備胎的目錄  7、檔案的名稱命名產生器

   為了讓大家更好的瞭解,咱們再拿其中的一個儲存圖片位元組流的方法來講一下吧:

 

@Overridepublic boolean save(String imageUri, InputStream imageStream, IoUtils.CopyListener listener) throws IOException {//分析是如何儲存的//建立一個空的檔案File imageFile = getFile(imageUri);//建立一個臨時的檔案File tmpFile = new File(imageFile.getAbsolutePath() + TEMP_IMAGE_POSTFIX);//預設當前還是沒有進行載入boolean loaded = false;try {//以臨時檔案建立輸入資料流的對象OutputStream os = new BufferedOutputStream(new FileOutputStream(tmpFile), bufferSize);try {//當前是正在拷貝對應的圖片loaded = IoUtils.copyStream(imageStream, os, listener, bufferSize);} finally {IoUtils.closeSilently(os);}} finally {if (loaded && !tmpFile.renameTo(imageFile)) {loaded = false;}if (!loaded) {tmpFile.delete();}}return loaded;}
從以上的代碼中,我們知道 會建立一個臨時緩衝圖片的檔案,依據的參數是uri,然後利用工具類的方法將輸入資料流拷貝到輸出資料流中。

接下來需要說明的是有限的生命週期的磁碟的緩衝LimitedAgeDiskCache

相對於抽象類別而言,當前的類的成員變數新增加了兩個:

//檔案的最大的壽命private final long maxFileAge;//其中的每一個檔案都對應的是一個壽命的日期private final Map<File, Long> loadingDates = Collections.synchronizedMap(new HashMap<File, Long>());

其中的檔案的緩衝的最大的時間maxFileAge的單位是秒,  而對應的HashMap的作用則是緩衝圖片檔案所對應的載入的時間。

可以稍微的關注一下在這個類中快取檔案載入的時間的函數

private void rememberUsage(String imageUri) {//首相建立檔案的控制代碼File file = getFile(imageUri);//擷取當前的時間long currentTime = System.currentTimeMillis();//記住修改的時間file.setLastModified(currentTime);//放到記憶體中loadingDates.put(file, currentTime);}

相對於有緩衝的時間限制的LimitedAgeDiskCache,UnlimitedDiskCache顯然更好理解一些,與其父類抽象類別是一樣的。也就不再贅述。




 


詳細講解Android的圖片下載架構UniversialImageLoader之磁碟緩衝(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.