日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 缓存头像,android 实现类似微信缓存和即时更新好友头像示例

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 缓存头像,android 实现类似微信缓存和即时更新好友头像示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

使用微信時我們會發現,首次進入微信的好友列表時,會加載好友頭像,但是再次進入時,就不用重新加載了,而且其他頁面都不用重新加載,說明微信的好友頭像是緩存在本地的,然后好友修改頭像后,又會及時的更新,這個功能是如何實現的呢,我們來分析一下

分析

關于頭像緩存的實現

頭像是網絡圖片,而且數據量較大,如果用我們常用的SharedPreferences將頭像以Bitmap的形式存儲,勢必會造成OOM,這個方法是行不通的,我們存儲的只能是圖片的地址,但是如果只存儲地址的話,要轉化成圖片,還是要通過網絡請求重新加載,達不到我們要求的效果,所以我們需要在磁盤中單獨開辟一塊空間,將頭像以Bitmap的形式進行存儲,如何實現呢?其實關于網絡圖片的緩存,有很多開源的第三方框架,比較可靠好用的如xUtils,Glide,volley,Universal-Image-Loader,Picasso,Fresco等等。

下面我們以常用的xUtils為例首先對BitmapUtils的實例化,對于磁盤緩存路徑,磁盤緩存空間大小,內存緩存的空間大小,內存緩存百分比可以自定義,也可以使用默認配置,代碼如下:

/**

* @param context 上下文

*/

public BitmapUtils(Context context) {

this(context,null);

}

/**

* @param context 上下文

* @param diskCachePath 磁盤高速緩存路徑

*/

public BitmapUtils(Context context,String diskCachePath) {

if (context == null) {

throw new IllegalArgumentException("context may not be null");

}

this.context = context.getApplicationContext();

globalConfig = BitmapGlobalConfig.getInstance(this.context,diskCachePath);

defaultDisplayConfig = new BitmapDisplayConfig();

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盤高速緩存路徑

* @param memoryCacheSize 內存緩存空間大小

*/

public BitmapUtils(Context context,String diskCachePath,int memoryCacheSize) {

this(context,diskCachePath);

globalConfig.setMemoryCacheSize(memoryCacheSize);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盤高速緩存路徑

* @param memoryCacheSize 內存緩存空間大小

* @param diskCacheSize 磁盤高速緩存空間大小

*/

public BitmapUtils(Context context,int memoryCacheSize,int diskCacheSize) {

this(context,diskCachePath);

globalConfig.setMemoryCacheSize(memoryCacheSize);

globalConfig.setDiskCacheSize(diskCacheSize);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盤高速緩存路徑

* @param memoryCachePercent 內存緩存百分比

*/

public BitmapUtils(Context context,float memoryCachePercent) {

this(context,diskCachePath);

globalConfig.setMemCacheSizePercent(memoryCachePercent);

}

/**

*

* @param context 上下文

* @param diskCachePath 磁盤高速緩存路徑

* @param memoryCachePercent 內存緩存百分比

* @param diskCacheSize 磁盤緩存空間大小

*/

public BitmapUtils(Context context,float memoryCachePercent,diskCachePath);

globalConfig.setMemCacheSizePercent(memoryCachePercent);

globalConfig.setDiskCacheSize(diskCacheSize);

}

一般情況下,我們只需要使用默認配置就可以了,即

BitmapUtils bitmap = new BitmapUtils(context);

然后對圖片的緩存和顯示

/**

* 根據圖片路徑,顯示到具體的View上

* @param container 要把圖片顯示到的View

* @param uri 圖片路徑

*/

public void display(T container,String uri) {

display(container,uri,null,null);

}

/**

* 根據圖片路徑,顯示到具體的View上

* @param container 要把圖片顯示到的View

* @param uri 圖片路徑

* @param displayConfig

*/

public void display(T container,String uri,BitmapDisplayConfig displayConfig) {

display(container,displayConfig,null);

}

/**

* 根據圖片路徑,顯示到具體的View上

* @param container 要把圖片顯示到的View

* @param uri 圖片路徑

* @param callBack 加載過程回調各種狀態

*/

public void display(T container,BitmapLoadCallBack callBack) {

display(container,callBack);

}

/**

* 根據圖片路徑,顯示到具體的View上

* @param container 要把圖片顯示到的View

* @param uri 圖片路徑

* @param displayConfig 位圖顯示配置

* @param callBack

*/

public void display(T container,BitmapDisplayConfig displayConfig,BitmapLoadCallBack callBack) {

if (container == null) {

return;

}

if (callBack == null) {

callBack = new DefaultBitmapLoadCallBack();

}

if (displayConfig == null || displayConfig == defaultDisplayConfig) {

displayConfig = defaultDisplayConfig.cloneNew();

}

// Optimize Max

BitmapSize size = displayConfig.getBitmapMaxSize();SizedisplayConfig.setBitmapMaxSize(BitmapCommonUtils.optimizeMaxSizeByView(container,size.getWidth(),size.getHeight()));

container.clearAnimation();

if (TextUtils.isEmpty(uri)) {

callBack.onLoadFailed(container,displayConfig.getLoadFailedDrawable());

return;

}

// start loading

callBack.onPreLoad(container,displayConfig);

// find bitmap from mem cache.

Bitmap bitmap = globalConfig.getBitmapCache().getBitmapFromMemCache(uri,displayConfig);

if (bitmap != null) {

callBack.onLoadStarted(container,displayConfig);

callBack.onLoadCompleted(

container,bitmap,BitmapLoadFrom.MEMORY_CACHE);

} else if (!bitmapLoadTaskExist(container,callBack)) {

final BitmapLoadTask loadTask = new BitmapLoadTask(container,callBack);

// get executor

PriorityExecutor executor = globalConfig.getBitmapLoadExecutor();

File diskCacheFile = this.getBitmapFileFromDiskCache(uri);

boolean diskCacheExist = diskCacheFile != null && diskCacheFile.exists();

if (diskCacheExist && executor.isBusy()) {

executor = globalConfig.getDiskCacheExecutor();

}

// set loading image

Drawable loadingDrawable = displayConfig.getLoadingDrawable();

callBack.setDrawable(container,new AsyncDrawable(loadingDrawable,loadTask));

loadTask.setPriority(displayConfig.getPriority());

loadTask.executeOnExecutor(executor);

}

}

從這段代碼中我們可以看到,當要加載某張圖片時,會根據圖片地址進行查找是否有對應的bitmap緩存圖片,如果有就直接引用緩存,如果沒有就加載并緩存,所以我們對圖片的緩存只需要實現以上方法就可以了,而且只要設置相同的緩存路徑,就可以實現一個頁面緩存后,其他頁面有相同圖片也可以調用。那么緩存之后,好友更新頭像,又是怎么做到即時更新的呢?

緩存后如何實現即時更新頭像

根據查閱的資料,可以歸結為以下幾種實現方式:

1.在服務器返回用戶數組時多加一個字段頭像最后一次修改時間或者修改過幾次等標志符,與緩存進行比較,是否有變化

2.利用圖片的checkSum來實現,如果check到這個數字有變化,就會自動去更新

3.利用socket監聽,當好友頭像更新時候首先會告訴服務器,服務器將變化通知推送到所有好友,好友監聽收到通知后自動更新

第一種方法和第二種方法本質是一致的,通過請求服務器的數據與本地緩存進行對比,是由客戶端處理的,第三種方法的話你換一次頭像就要服務器去提醒你的所有好友一遍,服務器壓力會不會比較大

仔細去研究一下微信,就會發現,當好友頭像修改后,如果你停留在某個頁面,進入的這個頁面是之前進入過的,還沒有銷毀,頭像是不會改變的,你需要打開一個新的頁面或者重新進入微信,才會更新頭像,由此看出,微信并不是用的第三種方式,而是采用了前兩種方式的實現原理,只有在創建一個Activity或fragment時,調用接口,讀取服務器數據時才會更新頭像

總結

通過以上的分析,我們基本捋清了思路,要實現類似微信的緩存和更新還有頭像,先是在磁盤開辟一個空間,用于讀寫頭像的Bitmap,然后創建頁面時,讀取服務器數據和本地緩存進行比較,如果有變化就進行更新

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持編程小技巧。

總結

如果覺得編程之家網站內容還不錯,歡迎將編程之家網站推薦給程序員好友。

本圖文內容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。

小編個人微信號 jb51ccc

喜歡與人分享編程技術與工作經驗,歡迎加入編程之家官方交流群!

總結

以上是生活随笔為你收集整理的android 缓存头像,android 实现类似微信缓存和即时更新好友头像示例的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。