本发明涉及移动应用技术,尤其涉及一种安卓原生应用中利用缓存框架和时间戳更新图片的方法。
背景技术:
对于移动应用来说,不可避免的要使用丰富多彩的图标,有im功能的应用会有通讯录,会话列表的头像等图片,这些图片全部存在移动客户端是不现实的,所以使用图片加载框架是个必然的选择。图片加载框架的实现多种多样,但原理大致相同,都是使用一定的内外存空间和适当的算法,如lru算法,fifo算法等,来管理图片缓存,这是通用且比较优秀的做法。但是,在实际应用过程中,有一些应用场景下,这些图片加载框架有些缺陷,如图片加载框架的加载顺序是先从内存加载,如果内存中没有已经存在的对应图片则从外部存储中读取,如果外部存储也没有,则从网络获取所需图片。这就产生了一个问题,如果在应用使用过程中服务端的图片发生了改变,类似用户更新了自己的头像,在另一客户端,由于改变头像的用户上次使用的头像缓存仍然存在,那么按照图片加载框架的加载顺序就不会去服务器端下载新的头像图片。这种情况下,在很长时间内用户头像的改变就不会生效,这就造成了更新不及时,体验不够好的问题。
技术实现要素:
为了解决以上技术问题,本发明提出了一种安卓原生应用中利用缓存框架和时间戳更新图片的方法,不改变图片存储地址,更新图片,实现在不影响缓存的情况下,完成图片更新的思路。
本发明中,加入了不改变图片存储地址,更新图片的方法。在进入应用的时候,要带着lastquerytime去检查图片改变的情况,如果有改变则返回新的lastquerytime。当用到图片时,例如在通讯录或会话列表中需要使用某个图片,此时在图片的地址后面拼接一个时间字符串,用这个时间串来区分是否需要进行网络请求。图片缓存框架本身的缓存机制是,有此图片地址所对应的缓存则直接读取缓存中的图片,没有此地址才进行网络请求,增加一个lastquerytime作为区分,如果图片更新过,那么lastquerytime会存储新的值,当图片缓存框架检查缓存时,会发现此时没有对应的图片缓存可用,就会发起网络请求获取新的图片,当服务端收到请求后,将lastquerytime这段字符串去掉,返回新的图片,这样就完成了图片更新。
主要通过以下步骤:
1、在应用中集成imageloader,方法是在build.gradle文件中加入依赖声明,并同步依赖。
2、为imageloader配置全局的相关属性,如分辨率,内存空间,外部存储空间,图片质量,并发数等。
3、封装imageloader管理类,把第三方提供的api封装到管理类,如果以后需要替换只需替换这一个管理类。
4、进入应用主页时,在检查更新的请求里带着lastquerytime去请求更新。
5、此时如果服务端,检查到有更新的内容则返回修改过的信息。
6、客户端存储服务端返回的信息。
7、使用lastquerytime和图片地址加载图片,拼接图片地址后面加一个lastquerytime。作为查找缓存的key。
8、使用第七步中得到的key,查找缓存中是否有这个key对应的图片,包括内存和外部存储中的。
9、当数据发生了更新时,lastquerytime这个值已经改变,此时缓存框架差找不到对应的图片缓存,缓存框架会发起网络请求获取新的图片,服务端接收到,根据图片地址返回新的图片这样就完成了一次更新。
附图说明
图1是本发明的工作流程示意图。
具体实施方式
下面对本发明的内容进行更加详细的阐述:
其具体实施方式举例如下:
1、在工程中引入imageloader。
compile
'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
2、在myapplication里初始化imageloader的配置
3、封装imageloader管理类
4、带着lastquerytime去获取更新。
apiservice.getcontactuserlist(contactuserlastquetytime);
5、服务器端检查上一次更新到本次更新之间是不是有更新内容,如果有则返回更新记录。
6、接收到更新之后更新lastquerytime,并存储到数据库
7、组装访问图片的地址,拼接图片地址和lastquerytime,lastquerytime放在图片地址后面,得到一个图片地址和lastquerytime的组合地址。
8、imageloader显示图片,先根据组合地址查找是否有组合地址的缓存,如果有则显示。
9、没有组合地址对应的缓存,则访问网络,服务端得到组合地址后,去掉拼接的lastquerytime,查找到图片地址返回图片文件。