00:00
那接下来我们就讲内存缓存,那么既然我们刚才所说这种已经过时了,对吧,那这时候就用一个新的类,那么在讲这个内存缓存之前呢,给大家看一个文章,这文章在哪里呢?在第六天一个三级缓存的这个地方里面给他看好好。这是一个博客啊,这个博客我们是随意找的,来看一下,它叫安卓图片三级缓存之内存缓存告别引用和啊告别裸引用和引用对吧?好,然后呢,这个我们写的博客是吧?那之前项目同时使用了图片三角缓存,今天整理的时候发现同志还是用这个引用啊合引用来管理内存中的缓存,看到这个时候我感觉不对劲,脑海中之前。啊,这个文章中出现啊,因为在点三啊开始垃圾回更倾向于回收持有引用和引用的对象啊,这引用啊,这个论用变得什么不可靠,这就是官方文档的一个描述,好,具体翻译成如下啊看下我们看一下啊好。
01:18
啊,引用从始向用不可注,这是它的原因吧,那这是例外,他又补充了才3.0过后,图片啊,图片的数据会图片的数据会缓存在本地的内存当中,因而无法用一种可预见的方式释放,这就潜在的风险造成内存溢输并崩溃。所以看到还有很多文章还推使用这个就感觉什么out了。
02:00
明白吧,好,接下来现在是已知啊,我们现在讲的是内存缓存,那肯定一会引用到一个新的技术,我们看了它就又分析,我们看一下文章啊,就看人下怎么去分析的。包括以后你们工作要学会看博客,所以我们在上课的时候,或多或少会加上这么一些博客,那你们一起我们一起看知道吧,就是课程故意这么设计的,我们看一下。因为以后你们工作啊,都要用到看别人的博客吧,对不对?好在你应用的UI加一张图片是一件很简单的事情,请存用一张图片受益类大家都知道很简单是吧?但是当你需要在页面里面加载一大堆图片,情况就变得复杂,其实也简单,复杂就在于内存运出对吧?在很多情况下,比如隶属国内U和VP减。这样的组件,屏幕上显示的图片可以通过滑动等事件不断的增加,最终有可能会导致什么内存溢出,注意OM是什么内存溢出好,为了保证内存使用始终维持在合理范围,注意合理范围溢出又不崩溃的这个范围对不对?
03:12
那么通常会把移出屏幕的图片进行什么?回收处理,那么此时垃圾回收器就举个例子啊,我们往下拉往下拉往下拉往下拉上面的那图片为什么回收了,通常是这样处理吧,好。注意,此时垃圾回收区认为你不再持有这图片的引用。然后从而对这些图片进行GC操作,机C操作,是不是就大家飞速去跑起来了,用这种思维解决问题非常好,可是为了让程序快速运行在界面快速的加载图片,你又必须要考虑某些图片回收之后,用户又重新滑落屏幕,这种情况就比如说往上滑,但是用户是可能可能还什么往下滑,那你回收了,你都回收了,你还要再加进来,是又相当于重新请求了,那不是又相当于是。
04:08
相当于是像我们农村说句话叫脱脱裤子放屁,多余的你。就说你刚才做的事情是白白的做了是不是,那也就是说你你往下拉,结果又往上就往下拉后又往上拉,是不是重新又重新请求了,那就不好嘛,对不对,又占内存好,那这个怎么办呢。那这个时候才重新加的情况,这个时候重新加载一遍刚刚加的图片,无疑是性能的什么瓶颈,你需要想办法避免这种情况的发生,这个时候就要使用内存缓存技术和很好解决问题,它可以是组件。啊,快速的重新加载和处理图片,下面就来看看内存缓存技术。好,那么这个速度它就有了啊,缓存技术,从而让你的应用加载很多图片的时候,可以提高速度和流畅性。内存缓存技术对那些大量占有啊,占用内存啊,就占用应用程序宝贵内存的图片提供了快速访问方法。
05:12
其最核心其最核心的类就叫LK,此类是在微几胞啊为细胞提供,这个类非常适合用来缓存图片,它主要算法原理是把最近使用的图片用强引用,注意它其实内部还是用到什么强引用啊啊,只是它把它封装了是吧?原理把最近最近使用的对象用强引用啊存储到link件map中,并且把最近最少使用的对象。在缓存设定值之前,从内存中什么移除啥意思呢?这句话的意思就是我设定一个构建空间。
06:00
然后如果常用的图片和对应的图片就用强引用关联,强引用关联它它有可能被释放吗?不会,但是对于那些用的比较少的,如果他到这个设定八兆或者上设定这个值已经快满了,就把这些不常用的把它什么移除,注意这个Li ruu是什么意思啊。近期最少使用什么算法,谁用的少他就会帮我们算出来知道吧,啊,那么这个类就有这个特点啊,啊下面的话就是一个翻译了啊,那怎么用呢?一会的话我们就会一个工具类。然后呢,要取最大可用内存的1/8,就八分之一来还原图片,然后呢,这里面这个方法计算每张图片,然后添加移除等等,好我们就用用啊。好,那同学们接下来我们就去来做一做了。
07:00
好这个嘞,好慢慢的。好好,这是内存吧,看你看其实也有这个类啊条U,好,然后这个就是我们的一个什么。内存缓存工具类。工具对好把这个类呢,把那个什么创建出来好,那这个就是我们内存环境工具类好,那么接下来意要把它给什么六出来,注意六在那里六啊,一定要六在最前面,为什么留最前面呢?一会在本地获取过也缓绕内存中啊,所以要把它放在这里,然后大家还记得当我们网络缓存好的时候,要在哪里缓存一份呢?是在本地和内存都要缓存一份呢,所以要把那什么存到哪里去啊。
08:16
存到网络很多工具里面去,接下来同样要把它什么接收好,把它给串建出来好,那这个是往内存缓存工具好,那么有了过后在这个地方里面,大家想想我们把它构造。的话是我们要写一下的各种方法呀,不显它有个默认的对吧,但是我们想做点事情这样显出来啊,好,然后在这个地方里面,我们就要去定义一个LR。就是L。
09:00
Catch好,然后嘞,这一个注意这里一个放型使map好,然后呢,就是这个类有了过后,在这个地方里面把那个什么溜出来。就出来,好,这个地方是最大的一个空间的,马克斯S,好,那同学们在我们这个地方里面,这个就是一个集合,是装图片的,装这个集合是不是就在内存中的,好大家看一下它这个用到了一个什么?是刚才我们这个文章说的一样啊,他用到一个什么。用到了一个啊零可还是map这么题吧,一样的是不是好再往下走。那这个值。这个也就是说这个内存呢,这个集合它在内存中占多大,是否要说好啊,要不然它会无限的大,肯定不行的,好这个时候呢,我们把它创建,那么我们将会使用。
10:13
我们。啊,应用的1/8。谁的1/8呢?给大家看一下好,谁的1/8呢?是这样的,使用系统分配给应用程序的1/8内存做作为什么缓存,注意1/8啊,注意是系统分配给应用的,就每个应用会被系统分配一定空间嘛,是不是,那么我们将会使用这个1/8好那么怎么。做呢,好,这个时候注意好运行时。然后就是,然后他这一块里面得到一个最大内存,最大内存的多少啊,注意这个最大内存是就是系统分配给我们应用程序的,那么除上多少把。
11:13
对吧,双八好那么就可以了,那么在我们这个地方要做一个什么强转。明白不?这就是1/8没问题吧?好,那接下来有了过后呢,我们计算每张图片,让我因为我用分之一来存储的话,那我怎么知,那我怎么知道这个下载的图片它已经达到1/8了。是要计算每一张图片大小啊,好,所以呢,要重写我们的方法。好,这里面在重过程中注意啊,这个地方还得像这个对吧,那这个时候我们就点一下什么。扣的,然后这里面有一个方法计算每张图片。好,那么在我们这个地方,这是一张图片吧,好,我们重写。
12:05
然后在这个地方里面,它就有个方法好get我们的什么呢?这个count就可以了,然后呢,其实这里面它还有一个方法,就是用这个方法,这个的话可以向低版本兼容,知道吧,好,所以的话呢,我们就把它变成这个。好,然后嘞,加上它是多了一个括号啊好,那么在我们这个文章里面的话呢,注意它是不是除上一个1024啊,这里面是不也要除一个104啊,那么也就是说你这个地方里面除上1014,这个地方也要除,那如果这里不除是这里也可以不除啊,意思就是你的单位如果默认的情况下,大家可以看好默认的单位是什么呀。是BAT,注意啊,是BAT,看到没有,这是BYT吧,那么bet的话,那么你如果除上10S。
13:02
1024,那么这个地方是也需要什么。也需要双104,你就看啊,你那是不是是不是都可以通都都可以不除啊,啊注意啊,可以都不除,但是如果你只要有个地方除,这里面必须得除。那你不除是单位就不统一啊,对不对啊,要注意这一点,好,那么有了过后呢,这个集合就创建了。好,接下来就特别简单了啊,简单到什么程度呢?好,大家看好大看好,在我们这个地方里面,你看啊,我们这个时候就这样子,它不等于空。好或者这样,我我都懒得写了,直接复制。啊,粘贴把这个剪切。粘贴。粘贴这个干掉,然后把这个内存还图片成功好,那么这个方法的话也是根据UR去加载好,就这样把这个方法创建出来,串串扣,怎么怎么做呢?特简单,就是直接用这个集合去get me,这个时候就得图片简单吧,好根据URL从内存中什么获取什么对吧?好,那么注意我们现在直接获取是不是还没有保存呢?
14:35
好保存没关系,我们来到这里来是不把这个传到哪里去啊,存到这个网络里面去啦,网络里面在请求成功的时候,不光要在本地中保存,在要在那里内存要保存法好点,Put。Put好,是不是也要从路径和这个进去啊,好一样的。
15:00
好,那么有了过后呢,我们把它给创建出来。好,然后ru点有个方法,它put key到时是什么没有给就可以了,好这简单吧,好非常简单,因为这个类啊做的特别好了,就是这就是我们的一个根据URL保存图片到我们的L开的开这个啊集合中,其实这个集合是不是叫内存中啊对,好那么这个时候就是图片路径,这个就是我们的图片吧,好那保存,那么还有的话在我们地方里面大家想想。我们是不是还要把它,如果本地去获取这张图片,是也要把它放在内存中啊,好,那么把这个也存进去。
16:02
好把它给创建这样的一个过来,然后把它给接收一下,好然后把那个什么出来,好,然后有那个后在地方里面你看啊,你一旦去get了,如果有了,是不是我就去把那个什么。保存好,所以这个地方我们其实还做一个判断,别的map如果不等于空,我才去保存吧,好,然后就put好,那么图片来呃。根据就把这两个保存看这图片地址有了吧,然后接下来这个就什么。这就是他好,那么我们看一下同学们在我们这个地方里面,我们用这个对不对,不能用加密的吧,这个这个没有加密的好,那这样的话就可以了。知道吧,好,那么我们可以这样子就是。
17:03
从本地保存到内存中。是吧,好,把图片从本地中保存,内存弄是吧?好,那我们看一下同学们连起来。好,然后在我们这个里面,我们再去把它给移除,是它所的好,那我们看好。我们运营起来就可以了啊,稍等。等一下,顶着。不动。好,这个是刚开始肯定是联网请求被我们删掉了,好好那么往上拉。是内存中了,是直接到内存中了,你看但是也看到什么是本地是吧,好那么这个时候呢,他优先。从什么本地访问内存,然后在本地加载好,我们再往下拉,往上往上好,再往上。
18:06
好,我们看啊多一点吧。好是这次是是连方请求吧,好再往下是内存中啊,内存中的看到没有注意啊,它其实图片你你你看一下诶,他怎么会把图片保存到内存中。是因为是,其实他在内存中它就保存也保存不了几张图片知道吧,但是如果图片小就很有价值了。知道吧,但图片很大,它空间毕竟有限嘛,是不是这样的话你看就可以了,明白吧,搞定了,这就3G缓存,很酷的是吧?是不是好,再给你们做一点补充啊。是这样的。大家想想,我们把图片保存到SD卡中了。那有一种情况就是。读,在读图片的时候,你们觉得快吗?其他肯定比网络快,但是有时候会比网络慢,为啥呢?就是你看现在手机,有时几百块钱的手机啊,你想几百块钱手机,一张SD卡都不值几百块钱了,有时候那么这个SD卡肯定是伪劣产品,就是很差的产品,那读的话是可能好使啊,真的读不出来,这是怎么办呢?你作为一个如果这张图片都超过60毫秒或者是50毫秒。
19:18
那么你你想这图片能肯定是死活也读不出来了,一般来说你在本地的图片瞬间都读完了对不对,瞬间读完了,结果你花了100毫秒,显然是不行,就说只要超出50毫秒,那么我们就就去网络请求,网络请求比比他反而快一些,对不对,所以注意啊,这是一个一个百度的哥们,他告诉我的,因为他是专门做的一个图,图片加载啊,这一块的就特别好,他说在低端手机上咱们就做一个处理。只要超出。读读SD卡图片超出50毫秒,那么他就认为不成功了,就直接从网络去请求,反而会更流畅,在插到手机上,他们的逻辑也很流畅,知道吧,这就细节啊,好注意啊,是读SD卡的时候,就是本地缓存的时候,他取的话有问题啊。
20:10
好,那同学们,三级缓存就是首先一进来从网络获取。啊,一进来,如果这个图片在内存中存在希的内存中没有的话,在本地,本地如果有声请保存在内存中,如果本地也没有,在网络网络库在内存中保存份,网络中缓存啊,这个本地缓存份。内存的缓存,那么再往上滑,这个时候他就去网络中获取了吧。对不对啊,就内存中获取了啊,内存中获取了啊,就这样就么个过程,明白了吧,先内存中没有到本地,本地有缓存到内存中,然后。本地也没有,然后在网络,网络有过后,再在内存中和本地中保存一份,然后再往上拉,就又这样循环,明白了吧,好,同学们,这就是我们所讲的三级缓存,就图片三级缓存中的内存缓存保存下。
我来说两句