天天看點

讓Picasso不緩存圖檔

問題描述:大多APP都有更換個人頭像的功能,樓主在開發中遇到了當更換頭像時,頭像沒有更換過來的問題,我用的是Picasso圖檔請求架構,而這些加載圖檔的架構一般都會有三級緩存政策,當我們去加載一張圖檔的時候就會優先查找本地有沒有,當一張圖檔已經加載過了之後就會緩存到本地,雖然我們更換了頭像,但是圖檔的url沒有變,是以再次加載的時候還是原來本地緩存的圖檔,而不是新的圖檔,是以我們在加載圖檔的時候可以設定不進行緩存即可,這樣每次修改完頭像就加載的是新的頭像了…

寫法如下:

Picasso.with(context).load(url)

                       .memoryPolicy(MemoryPolicy.NO_CACHE)

                       .networkPolicy(NetworkPolicy.NO_CACHE)

                       .error(R.drawable.default_icon)

                       .into(imageView);

其中.memoryPolicy(MemoryPolicy.NO_CACHE)這句的意思就是不進行緩存。

 .networkPolicy(NetworkPolicy.NO_CACHE)不進行網絡圖檔緩存

标準行為

Picasso執行個體中有如下預設設定:

This instance is automatically initialized with defaults that are suitable to most implementations.
  • LRU memory cache of 15% the available application RAM
  • Disk cache of 2% storage space up to 50MB but no less than 5MB. (Note: this is only available on API > 14+ or if you are using a standalone library that provides a disk cache on all API levels like OkHttp)
  • Three download threads for disk and network access.

緩存的大小可以随意更改,但顯然超出了這篇文章的範圍。回到主題上來:Picasso首先會嘗試去記憶體中加載圖像,如果最近沒有加載過這張圖檔,或者這張圖檔并不存在于記憶體中,Picasso會去磁盤中檢查它的存在。如果磁盤中也不存在,則開啟網絡請求。

此外,所有請求成功的圖檔都會儲存到記憶體和磁盤中(除非為了釋放記憶體而被删除)。總而言之就是,Picasso的加載路徑為記憶體->磁盤-> 網絡。

可以通過自定義記憶體和網絡加載政策改變Picasso的行為。接下來一起看下

MemoryPolicy

記憶體政策

再說一遍,Picasso試圖先從記憶體中加載圖檔。如果你想讓Picasso跳過記憶體查找,可以在Picasso請求上調用

memoryPolicy(MemoryPolicy policy, MemoryPolicy... additional)

MemoryPolicy

是隻有兩個

NO_CACHE

NO_STORE

值的簡單枚舉類。

舉例來說,可以使用

NO_CACHE

限制Picasso從記憶體中加載圖檔,示例如下:

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[1])
    .memoryPolicy(MemoryPolicy.NO_CACHE)
    .into(imageViewFromDisk);
           

如果你想知道如何使用

NO_STORE

這個枚舉:比如說,目前請求的圖檔,隻會被使用一次,那麼就應該調用

.memoryPolicy(MemoryPolicy.NO_STORE)

。是以,Picasso不會把這張圖檔放入到記憶體緩存中。

當然,你可以在一個請求上聯合使用這些特性:

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[1])
    .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
    .into(imageViewFromDisk);
           

需要注意的是,調用

.memoryPolicy(MemoryPolicy.NO_CACHE)

不會阻止Picasso從磁盤中查詢圖檔!如果想跳過這兩個緩存查詢,你需要看一下

NetworkPolicy

網絡政策

NetworkPolicy

調節磁盤緩存的方式與

MemoryPolicy

調節記憶體緩存的方式一樣。甚至枚舉的命名都是一樣的。

如果你想跳過磁盤緩存,可以使用

NetworkPolicy.NO_CACHE

作為參數,調用

.networkPolicy(NetworkPolicy policy, NetworkPolicy... additional)

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[2])
    .networkPolicy(NetworkPolicy.NO_CACHE)
    .into(imageViewFromNetwork);
           

目前,你可以把之前提到的任何可能的配置進行合并:

Picasso  
    .with(context)
    .load(UsageExampleListViewAdapter.eatFoodyImages[2])
    .memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
    .networkPolicy(NetworkPolicy.NO_CACHE)
    .into(imageViewFromNetwork); 
           

最後,

NetworkPolicy

還有第三個可選參數:

OFFLINE

。如果選擇這種模式,Picasso将會從記憶體或者磁盤中查詢圖檔,如果這兩種緩存中都沒有查詢到結果,即便網絡連接配接可用,Picasso依然不會開啟網絡請求去加載圖檔。