Android性能优化之三级缓存

Hi,众猿猿们,今天本猿为大家带来本公众号的第一篇文章,讲一讲Android开发中的缓存的问题吧,抱歉,第一天就给大家讲这么一个不太基础的问题。如果你的UI和四大组件相关的基础太不太好的话,那么本猿建议你可以先加强一下基础,在公众号中回复资料,可获取相关学习资料。
在Android中,缓存一般分为三级:内存缓存,本地缓存和网络缓存,其中在内存缓存中获取数据最快,但可能造成内存溢出;从网络获取数据最安全,但速度最慢,而且还消耗用户流量。一般需要被缓存的对象都是从服务器端获取的数据,它们大致上可以分为两种:Json数据和图片数据。
当我们需要使用某一数据时,我们先在内存中查找该数据,如果找不到,就去本地找,找到了就将其加载进内存中(内存缓存)使用,如果本地没有,就去网络上获取该数据(网络缓存),找到了就加载进内存(内存缓存),并储存一份在本地(本地缓存)。网络缓存为内存和本地缓存提供数据,它需要在服务器端实现,这里本猿猿不打算细说。
先说Json数据(如果你对Json的格式和解析还不熟悉的话,那基础还要加强呀)。一般来说,Json数据所占用的内存很小,不会引起内存泄露等问题,所以我们一般直接考虑其本地缓存问题。从服务器上获取到数据后,可以使用sharedpreference将数据储存在本地(当然你也可以用文件等其它方式),其key即为json数据的url。
 下面重点说下图片缓存问题:
 对于图片的本地缓存,本猿猿推荐文件方式,因为图片一般比较大,在sharedpreference中存放不太合适,文件名就用图片对应的url,且我们需要为图片缓存建立一个专门的文件夹,这样在查找图片时也很方便。
 对于图片的内存缓存,众猿猿们就不能像json的一样不管不问了,一张图片在内存中动不动就占据几十k,如果每次你在网络上获取了一张图片(假设其为bitmap),用完后就不管不问了,那你的应用离内存溢出(Out of Memory, OOM)就不远了,因为从Android 3.0 (API Level 11)开始,图片的数据会存储在本地的内存当中,因而无法用一种可预见的方式将其释放(到底咋样不可预见本猿也不清楚),总之Java垃圾回收线程什么时候回收图片所对应的对象,并不时我们程序猿能控制的。大家也可以自己写一个小程序验证一下(如果这个验证程序写不出来的话,那么你的安卓基础需要加强呀亲)。
你也可以每次用完图片后,将bitmap对象(bitmap本身只是一个引用,它指向的是Java堆栈中的一个对象,如果你不知道这个的话,那么你的Java基础需要加强呀亲)置为空,即完全舍弃内存缓存,那如果应用里面有个需要大量图片的listview等控件,那岂不是置应用流量于不顾。
要解决内存溢出问题,我们先看看它是怎么产生的吧。安卓系统在运行一个APP的时候,会为它分配一定的内存(一般是16M,这个视手机性能而定),当APP中的图片占据了过多的内存时,那么就会发生内存溢出。
我们初步的解决办法是,划分出一部分内存空间(一般为可用内存的1/8,我们暂且称之为警戒值),专门用于储存图片资源,我们暂且称之为图片内存。当有一张新图片需要加载进内存缓存时,先判断加入后图片内存是否超过了警戒值,若超过则从图片内存中移除图片直至达到安全值,否则直接将图片加载进图片内存。
好了,现在我们要想想该怎么去移除图片了,图片内存中的图片都是随时可能会用到的图片,如果随便移除一张的话,说不定过一会儿我们又要用到它,所以这里我们应该采用某种算法来计算应该被移除的图片(如果你能想到某种算法的话,那你的算法基础还不错哟)。
图片缓存的移除算法并不唯一,最常使用的是最少最近使用(least recentlly used, LRU)算法,该算法总是趋向于移除最近被使用的次数最少的对象,其实现方法也并不唯一,可以用LinkedHashMap来实现,也可以用HashMap+链表来实现。
其实,Java为我们提供了一个对象:LruCache来实现以上功能,其内部就是用HashMap+链表结构来实现的,只要你掌握了LruCache对象的用法,不了解lru算法也是可以滴。
图片的三级缓存在android开发中不算是一个比较基础的问题,因此现在有很多的开源的第三方jar包对图片缓存提供了很好的支持,如谷歌官方推荐的第三方网络访问jar包Volley,中国人自己编写的工具包xUtils等,只要你在自己的项目中集成了它们的jar包并调用对应的类和方法去访问网络图片,那么图片缓存的工作会由这些第三方工具类自动完成,你甚至连LruCache对象都不需要了解。
好了,到这儿安卓开发的三级缓存基本就介绍完了。这可是本猿猿写的第一遍文章,如果有人在看的话,麻烦点个赞或回复句What a shit,好让本猿知道我不是在自言自语。老猿们如果发现有错误的话,请后台联系我偷偷改正吧,新猿们如果有问题的话,请直接留言吧,猿猿看到了会回复的。另外,本猿猿还开了一个微信公众号“猿聚于此”,微信搜索brooklee123即可发现,本猿猿会在微信上同步更新文章的,如果希望得到文章更新的最新消息的话,请关注这个微信号吧。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值