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

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JQuery 之 跳出循环

1、跳出each循环  return false 跳出循环 return true 进入下一个循环2、跳出for循环  break;直接退出for这个循环。这个循环将不再被执行!  continue;直接跳出本次for循环。下次继续执行。  return语句就是用于指定函数返回的值。即使函数主体中还有其他语…

android包结构规范,【Android】Android产品-开发规范

前言为什么需要开发规范?编码规范对于程序员而言尤为重要,有以下几个原因:1)一个软件的生命周期中,80%的花费在于维护2)几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护3)编码规范可以改…

JavaScript语法(二)

函数:完成某项特定的功能。 函数的四要素:名称、输入、返回值、加工。 定义函数:function(定义) 函数的名字(形参){ 函数体(加工)} 文本框加 按钮(调用) …

html 透明度渐变效果,CSS3不透明度渐变?

您可以在CSS中执行此操作,但Chrome浏览器,Safari和Opera的浏览器目前还没有太多的支持。 Firefox目前只支持SVG掩码。有关更多信息,请参阅Caniuse结果。CSS:p {color: red;-webkit-mask-image: -webkit-gradient(linear,left top,…

JSP知识点大致介绍1

解释:当jsp写好,运行服务器,还没有发出请求(写网址按Enter),Tomcat的work下是没有字节码文件的。当写网址:localhost:8888/xxxx/index.jsp按Enter,运行后work下就有字节码文件了&…

发一则自己创作的Lae程序员小漫画,仅供一乐

转载于:https://www.cnblogs.com/aaqxhaa1979/p/5817650.html

html打折代码,HTML打折计算价格实现原理与脚本代码

原标题:HTML打折计算价格实现原理与脚本代码打折后价格计算function calculator(){var pricesdocument.getElementById("price");var discountsdocument.getElementById("number");var pay;var selectdocument.getElementById("payfunctio…

Material Design控件使用学习 toolbar+drawerlayout+ Snackbar

效果 1.,导包design包和appcompat-v7 &#xff0c;设置Theme主题Style为NoActionbar 2.custom_toolbar.xml <?xml version"1.0" encoding"utf-8"?><android.support.v7.widget.Toolbar xmlns:android"http://schemas.android.com/apk/res/…

计算机组装虚拟实验,组装计算机的虚拟实验室

摘要&#xff1a;根据初中信息技术教育教学的特点:以实际应用能力为中心,以教育文化素质为根本,以掌握基本概念、强化应用为目的,加强技能训练,注重培养学生动手操作能力。对于提高学生的实际应用能力,模拟实验将是提升课堂效率极为重要的一个坏节。 本文针对目前算机硬件更新速…

使用渐进式JPEG来提升用户体验

今天才认识到原来JPEG文件有两种保存方式他们分别是Baseline JPEG&#xff08;标准型&#xff09;和Progressive JPEG&#xff08;渐进式&#xff09;。两种格式有相同尺寸以及图像数据&#xff0c;他们的扩展名也是相同的&#xff0c;唯一的区别是二者显示的方式不同。 Baseli…

html英文读法,classin读音发音 classln英文怎么读?

classln英文怎么读?class in 读音&#xff1a; [klɑːs] [ɪn] class英 [klɑːs] 美 [kls] in英 [ɪn] 美 [ɪn] 重点词汇&#xff1a; class英 [klɑːs] 美 [kls] n. 等级&#xff1b;阶级&#xff1b;阶层&#xff1b;班级&#xff1b;课&#xff1b;v. 分类 过去式: cla…

季度报告 选择日期_易方达富惠纯债债券型证券投资基金 2018年第4季度报告

2018年12月31日基金管理人&#xff1a;易方达基金管理有限公司基金托管人&#xff1a;中国银行股份有限公司报告送出日期&#xff1a;二一九年一月二十二日1 重要提示基金管理人的董事会及董事保证本报告所载资料不存在虚假记载、误导性陈述或重大遗漏&#xff0c;并对其内容…

Linux学习入门

作为当代前端&#xff0c;前后端的界限越来越小&#xff0c;要想走的更稳&#xff0c;学习Linux操作系统的相关知识是必不可少的。 为什么服务器端采用linux操作系统&#xff1f; 1.linux相对于windows的性能更加稳定 2.前期投入成本低&#xff0c;相比于windows的服务器产品&a…

html垂直边距,html – Styling Bootstrap的btn-group-justified,添加边距和垂直尺寸

HTMLOption 1Option 2Option 3CSS.blocks .btn-primary{padding: 24px 12px;margin: 0 5px;border-radius: 0;}将看起来像&#xff1a;If I apply btn-group-justified class instead of just btn-group,theybecame justified but still not square-shaped,nor they have margi…

iscsi 同步_群晖六盘位旗舰NAS,一文教你如何解决多设备同步,跨平台协调

作为一名非专业后期狗来讲&#xff0c;一直以来在多设备以及不同平台间的数据同步&#xff0c;协同上都想尽了各种办法。众所周知&#xff0c;对于剪辑师来讲。对于工作平台都会有自己的偏好&#xff0c;比如有老师傅会喜欢Adobe的PR作为剪辑软件&#xff0c;90后的年轻人又觉得…

Atitti.java exp ast java表达式语法ast构造器

Atitti.java exp ast java表达式语法ast构造器 /atiplat_cms/src/com/attilax/lang/AstParser.java 原理 分割tokens_slice_li 分析splitor&#xff0c;&#xff0c; 主要是dot 和end 作者:: ★(attilax)>>> 绰号:老哇的爪子 &#xff08; 全名&#xff1a;&#x…

计算机内图标wps云盘怎么去掉,Win10资源管理器WPS云文档图标如何清除

如果用户在Windows10系统中安装了WPS办公软件的话&#xff0c;那么资源管理器中就会自动生成WPS云文档图标。一些用户觉得这样很占用空间&#xff0c;就希望该将其彻底删除。该如何操作呢&#xff1f;接下来&#xff0c;就随小编一起看看具体步骤吧&#xff01;具体如下&#x…

englishpod主持人对话文本_Englishpod 23 | 主持人文本讲解

本期主持人对话中的主要语言知识点如下&#xff1a;泛听&#xff1a;建议请先听了录音&#xff0c;没听清的&#xff0c;再对照看文本本期知识点&#xff1a;1&#xff0c;Vocabulary preview(词汇预览)&#xff1a;(1) financial adviser 2&#xff0c;Language takeaway(语言…

计算机桌面上的声音图标没了怎么办,Win7电脑右下角声音图标不见了怎么办?...

最近有Win7用户反映&#xff0c;电脑右下角的声音图标总是莫名其妙的不见了&#xff0c;导致用户要调整音量的时候不知道从哪调整&#xff0c;这让用户非常烦恼。那么&#xff0c;Win7电脑右下角声音图标不见了怎么办呢&#xff1f;下面&#xff0c;我们就一起往下看看Win7电脑…

LeetCode 171 Excel Sheet Column Number

Given a column title as appear in an Excel sheet, return its corresponding column number. For example: A -> 1B -> 2C -> 3...Z -> 26AA -> 27AB -> 28 思路&#xff1a; 相当于26进制转10进制&#xff0c;要注意A从1开始而不是从0开始的边界条件。 …