欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

android實現(xiàn)類似微信緩存和即時更新好友頭像示例

引言

目前創(chuàng)新互聯(lián)建站已為上千余家的企業(yè)提供了網(wǎng)站建設、域名、虛擬主機綿陽服務器托管、企業(yè)網(wǎng)站設計、鳳縣網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

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

分析

關于頭像緩存的實現(xiàn)

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

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

 /**
 * @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 內(nèi)存緩存空間大小
 */
public BitmapUtils(Context context, String diskCachePath, int memoryCacheSize) {
  this(context, diskCachePath);
  globalConfig.setMemoryCacheSize(memoryCacheSize);
}

/**
 * 
 * @param context 上下文
 * @param diskCachePath 磁盤高速緩存路徑
 * @param memoryCacheSize 內(nèi)存緩存空間大小
 * @param diskCacheSize 磁盤高速緩存空間大小
 */
public BitmapUtils(Context context, String diskCachePath, int memoryCacheSize, int diskCacheSize) {
  this(context, diskCachePath);
  globalConfig.setMemoryCacheSize(memoryCacheSize);
  globalConfig.setDiskCacheSize(diskCacheSize);
}

/**
 * 
 * @param context 上下文
 * @param diskCachePath 磁盤高速緩存路徑
 * @param memoryCachePercent 內(nèi)存緩存百分比
 */
public BitmapUtils(Context context, String diskCachePath, float memoryCachePercent) {
  this(context, diskCachePath);
  globalConfig.setMemCacheSizePercent(memoryCachePercent);
}
   /**
 * 
 * @param context 上下文
 * @param diskCachePath 磁盤高速緩存路徑
 * @param memoryCachePercent 內(nèi)存緩存百分比
 * @param diskCacheSize 磁盤緩存空間大小
 */
public BitmapUtils(Context context, String diskCachePath, float memoryCachePercent, int diskCacheSize) {
  this(context, diskCachePath);
  globalConfig.setMemCacheSizePercent(memoryCachePercent);
  globalConfig.setDiskCacheSize(diskCacheSize);
}

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

BitmapUtils bitmap = new BitmapUtils(context);

然后對圖片的緩存和顯示

 /**
 * 根據(jù)圖片路徑,顯示到具體的View上
 * @param container 要把圖片顯示到的View
 * @param uri 圖片路徑
 */
public <T extends View> void display(T container, String uri) {
  display(container, uri, null, null);
}

/**
 * 根據(jù)圖片路徑,顯示到具體的View上
 * @param container 要把圖片顯示到的View
 * @param uri 圖片路徑
 * @param displayConfig
 */
public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig) {
  display(container, uri, displayConfig, null);
}

/**
 * 根據(jù)圖片路徑,顯示到具體的View上
 * @param container 要把圖片顯示到的View
 * @param uri 圖片路徑
 * @param callBack 加載過程回調(diào)各種狀態(tài)
 */
public <T extends View> void display(T container, String uri, BitmapLoadCallBack<T> callBack) {
  display(container, uri, null, callBack);
}  
 
 /**
 * 根據(jù)圖片路徑,顯示到具體的View上
 * @param container 要把圖片顯示到的View
 * @param uri 圖片路徑
 * @param displayConfig 位圖顯示配置
 * @param callBack
 */
public <T extends View> void display(T container, String uri, BitmapDisplayConfig displayConfig, BitmapLoadCallBack<T> callBack) {
  if (container == null) {
    return;
  }

  if (callBack == null) {
    callBack = new DefaultBitmapLoadCallBack<T>();
  }

  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, uri, displayConfig.getLoadFailedDrawable());
    return;
  }

  // start loading
  callBack.onPreLoad(container, uri, displayConfig);

  // find bitmap from mem cache.
  Bitmap bitmap = globalConfig.getBitmapCache().getBitmapFromMemCache(uri, displayConfig);

  if (bitmap != null) {
    callBack.onLoadStarted(container, uri, displayConfig);
    callBack.onLoadCompleted(
        container,
        uri,
        bitmap,
        displayConfig,
        BitmapLoadFrom.MEMORY_CACHE);
  } else if (!bitmapLoadTaskExist(container, uri, callBack)) {

    final BitmapLoadTask<T> loadTask = new BitmapLoadTask<T>(container, uri, displayConfig, 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<T>(loadingDrawable, loadTask));

    loadTask.setPriority(displayConfig.getPriority());
    loadTask.executeOnExecutor(executor);
  }
}

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

緩存后如何實現(xiàn)即時更新頭像

根據(jù)查閱的資料,可以歸結(jié)為以下幾種實現(xiàn)方式:

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

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

3.利用socket監(jiān)聽,當好友頭像更新時候首先會告訴服務器,服務器將變化通知推送到所有好友,好友監(jiān)聽收到通知后自動更新
第一種方法和第二種方法本質(zhì)是一致的,通過請求服務器的數(shù)據(jù)與本地緩存進行對比,是由客戶端處理的,第三種方法的話你換一次頭像就要服務器去提醒你的所有好友一遍,服務器壓力會不會比較大

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

總結(jié)

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。

網(wǎng)頁題目:android實現(xiàn)類似微信緩存和即時更新好友頭像示例
當前地址:http://aaarwkj.com/article36/ipoepg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化網(wǎng)站策劃、自適應網(wǎng)站、域名注冊靜態(tài)網(wǎng)站、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
精品福利视频蜜臀91| 亚洲av成人精品网站推荐| 亚洲免费av第一区第二区| 精品人妻少妇免费久久蜜臀av| 久久成人免费在线电影| 亚洲欧美日韩精品二区| 亚洲人成网站在线免费看| 蜜桃视频在线观看视频免费 | 男人的av天堂东京热| 韩国成人伦理片在线观看| 成人激情视频在线网页| 日本一区二区精美视频| 少妇午夜福利一区二区| 欧美亚洲国产精品久久久| 国产高清毛片区1区二区三区 | 亚洲精品中文字幕一二三| 日本熟妇一区二区三区高清视频| 天天操天天射夜夜爽| 精品黄色大片不卡国产| 久久亚洲一本综合久久| 欧美成人精品欧美一级乱| 中日韩一二三四区在线看| av一区二区日韩精品久| 国产av剧情精品麻豆| 亚洲av综合日韩精品久久| 亚洲国产日韩欧美在线| 国产精品乱码中文字幕| 尤物在线观看精品视频| 国产精品呻吟久久人妻| 国产原创av剧情六区| 欧美日韩亚洲国产精品视频| 日韩一区二区三级在线| 亚洲一区二区三区视频在线观看| 九九有点热以前的视频| 成人性生交大片免费看中文 | 国产亚洲精品视频中文字幕| 99热精品在线免费观看| 丰满的熟妇女教师水多| 中文字幕在线看二区不卡| 久久亚洲综合色一区二区三区| 男人天堂av一区二区|