問題描述:大多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依然不會開啟網絡請求去加載圖檔。