00:00
我们看一个。在开发中或者在面试中经常会说到的一个问题。叫Miss view的优化。啊,这里面呢,我们一共分了几层。先简单跟大家看一下。嗯,开始我写了一个第零层,也就是不优化。那不优化它实际上就是每一次我们最先写的时候,就是每一次去加载布局文件。啊,这样效率太低,你快速滑动呢,会有卡顿,甚至有可能出现什么内存溢出崩溃。好,后来呢,我们就想到需要去复用我的convert of view吧,其实复用很简单,就判断一下,如果他得空我才去什么加载。并把它赋值吧,那这样我们说过来一共加了多少次N加一次,然后这个N是什么意思啊,就是初始能显示的。
01:04
是行数啊,嗯。那它的问题是什么呢?它的问题就在于我下面会写什么呢?是不是会去找那个视图啊,我每一次get都会去打开的啊。去执行这个方法。Convert view.find view by ID。啊,去找只有。其实我们的子有那么多吗?需要找那么多次吗?譬如说我们的我们某一个view p的就是一个image view吧,你说我的那个内存里面一共有多少个image view对象是不是N加一个呀?但是我们实际上我们现在的这种方式。你说找的次数只有加一是吗?很多次对不对,来看一下我们的这个list view,我们list view上一次整过在哪个里面就他是吧。
02:06
后面好像是不是也整过一次,没有吧,来就看它吧。大家看呢?我们这么判断了一下是吧,OK,后面是每一次都会去,只要get view方法调用就调用它呀,你说什么时候会调用get view。是不是我滑动的时候就会就会掉啊,我这拿这是个逆式变换,我这拿着向上滑动或者向下滑动。我要滑的很快的话,这个方法掉的特别特别次数特别多对吧?嗯,那也就是说我的这一个找的次数也很多吧。我能不能把这个导的次数给降低了,因为实际上本身内存里面只有N加一个。对吧。
03:01
嗯,我希望只用在这个if里面找。找肯定,那前提是肯定要找的,你一次不找那是不可能的,对不对。那你找的次数也忒多了。嗯,后来呢,有人就啊设计了这样一种。啊,它会设计成一个类,这个类名是固定的。啊,也不是说你你一定要写这个,只是说大家都写这个名字,你要写别的。人家看着不爽。好啦,来。这里面呢,需要定义一个类。用它来去减少。这个的次数。啊,减少到只有多少次了,N加一次。好了,来看一下啊,这个类里面都是些什么东西呢?大家猜一下。这个里面都包含了什么东西?
04:02
就是所有需要更新的只右视图对象。是吧?啊。在这个里面,它会一上来还是跟以前的逻辑呢,有点相像,先判断一下它等不等于空。啊,如果等于空,我们现在做什么试卷。加载布局吧,好,加载完布局以后,后面你看他做了什么事,是不是去找孩子呀,我把找到的孩子放到哪个里面去了,是放到一个好的对象里面去了。这里面非常重要的一一个方法,还记得这个方法吗?它是不是用来去保存一个标识,保存一个对象的呀?哎,我把这个hold对象保存在convert of view对象身上。那如果convert又不等于空的话,你说它的T为什么呀?
05:00
你想看它等于空的时候,我新创建了一个cover of view,我是不是就设置了它的呀?那如果它不是新的了。那说明他里面保存的是什么,是不是hold呀,而且这个hold的保存的视图是谁的,视图是谁的。是不是看of view的view啊?因为你想嘛,你保存的时候是不是这一个hold里面保存的,保存的视图就是convert view的view。对不对。嗯。好,搞完它以后,后面就好办了。后面经过了这个方法以后,我的后是不是有视图了呀。你说我下面做什么呀?你说我下面我要想写的话写什么?啊,我先还是要得到数据对吧?啊得到数据假设我得到了一个破损对象了吧?啊这里面啊,假设得到一个破损对象啊,一个破损对象已经得到了,怎么date.get是吧?啊传一个position呢?好,你说下面我该怎么做?
06:17
怎么写hold.image view image吧,是不是从这里那个图片从哪找啊?是不是屁里面找啊。是吧,啊P里面找啊啊什么点get I是吧,好后面是不类似的,这不还有两个吗?还一个是不是点。T的view.set一个T的,我在P点个name是这个概念吗?对啊。这样的话,你想啊,我这样执行他的次数是不少了。
07:04
对吧。那你去通过ID去找某一个视图对象,它所消耗的时间。和这个消耗的时间哪个时间长啊。是不是find view ID去找需要的时间长啊,这个需要消耗时间吗?基本上不要,它就是个引用对不对。是不是直接点过去啊,就不存在什么找了。这样就会啊,提高你的效率啊,也就是说你数据越多,滑的越快,这个效果就越明显。如果你就一点数据慢慢划,那也没什么效果。那个时候也不需要这种了,对吧,那你也不能保证说一定啊,数据多或者少对吧,所以说尽量优化是大家必须的,好了,我们现在呢,来去给大家写一下啊。好看的。
08:02
啊,我这样啊,我还是把以前的这一个呢,给它存一下。来,在这里面我们去改改。在写他们之前啊,看到这里面把这个我先都去掉啊,先都去掉,去掉以后我们来想,首先我们得去定义一个类。对吧。啊,这个类呢,可以定义在de里面,也可以定义在呃,De的外面,这个都没问题啊,你定义在外面也行,定义在里面也行,好来定一下class。什么呀,叫will hold啊,你怎么去,你理解这个we hold,你说we hold,我把它看成什么hold什么意思?啊,持有持有者对吧,我可以看成一个叫仕途的容器。是这意思吧,那视图容器里面是包含了一些视图吧?
09:06
那我当前这个里面还有。我把它给删掉了,我们当前这里面是操作的是哪一个视图呢?我来看一下。应该他吧。我猜没猜的话有几个是多三个对吧?一个imagine you,两个text you。看着啊,我为了能够操作方便,你看到我把属性都写成什么public了啊,这个地方下边怎么写image为用啊,就写image得了啊。好,下面来一个两个text view,这个时候就不能写text view了啊,一个叫name TV啊,还有一个text view,这个叫什么呢?好像叫price吧TV。
10:00
好了吧,好了。那这个写法非常非常的固定,我先直接上手给大家写啊。它主要也分为这个几个方面,第一个啊,看到叫什么呢,创建诶诶。或得到一个为后的对象啊。得到当前行的斜杠。好,下面有了维护的对象以后看到啊,得到当前行的数据,其实这个就跟后前面差不多,当前行的数据对象。We hold,对象有了,是不是相当于他有了呀?啊,大家看啊这个题对得到得到对应当前行的啊一个V后的对象下面啊第三步就设置。
11:07
给view后对象中的视图设置数据总体呢分为这三步。第一步呢,最麻烦。为什么第一步这麻烦呢?因为它有两种可能性,有可能是创建的,也有可能是。得到的,那我先得定义一个对象,叫we hold hold等于那。那什么时候是创建,什么时候是去取了,得看谁呀,Convert view,如果他得空。那肯定是创业。对吧,如果他得空,那我们直接上来可以先溜一个都可以,直接上来先溜好没问题。
12:00
啊,关键是我光利一个对象里面的数据是不是还要复制啊,那里面的数据从哪,这些视图对象从哪来呢?如果它等于空,我是不等于什么去加载一个呀,来点in flight。写一个main activity this。好了,看r.me out点。你问他吧,嗯,用的用的就是他的啊好来一个能。就好了吧,好了,现在我是不是要从中取出指示图来复制给他呀?这个时候就同时做取和赋值同时进行image view等于convert view.find view by ID r.id.IV item。
13:04
害怕。旋转。对吧。能看懂吧?好,下面一个是name TV等于convert view.find view by ID啊,点id.tv item live做一个长转,还有一个。就是。来这里面写的是content对吧?啊,用的是这个ID名字用的content不用管它。好,下面我们已经把它写好了,那写好了以后,这里面有一个非常非常关键的,我需要保存将。Hold的对象啊,对象保存到哪个对象里面,是不是看of you的他上面去保存到它上面去啊,一般把一个对象呢,保存到它上,肯定用一个方法,就是set tag啊,总是用这个方法来保证数据。
14:18
来写一个什么好的我宝,它是为了什么时候用它呀,大家说。问了什么时候用。就在下面用。我如果不执行八十五行,我这个87行就没法写了。对吧。好,这个时候就去什么呀?取怎么取呢?Convert view.get tag返回的就是。Weholda。你在想嘛,Else是不是说明我的convert view是复用的呀,那复用的是不是以前我去创建的加载的呀?
15:01
那加载过的,那肯定有绑定。对吧。啊,而且你一定要知道啊,这一个hold里面保存的视图是当前行的视图,不是别的行了。好,搞定这一步,我们看一下总体的第二步。这个是超级简单的date.get传一个position,传一个音符啊,有了。接着往下看。给hold对象的视图设置数据,Hold对象不已经有视图了吗?点image of you.set image,嗯,是它们里面保存的是什么东西啊,看看是什么类型的数据类型,对吧?来看那就是resource了。Resource好了,怎么找shop in for.get来看看好好的点。
16:07
Name TV set text shop in for get嘞,好了吧,好。我写好,写的有点小问题啊,没管他来名,写的不太好。Shop get。是不是好了,嗯,这样我们就写好了。好。嗯,这里面啊,我们通过这一个打印,大家就应该要知道他一共find you把ID执行多少次,对不对。
17:04
嗯,把那个position给他写一下好了吧,嗯,好,下面呢,我们来去输出看一下。运行运行。我们找那个tag来看啊。大家看看。是不是012345对吧,好,你12345了以后呢,呃,在这里面还有别的打印啊,我呢,现在我划一下吧。来看。有还有吗?那我再画。再多滑一样,我反过来滑嘛,是不是反过来会调用电view啊。但是还会进入衣服吗?是不会呀。那不会的话,这个事情。
18:01
就不找了呗,那不用办了,又不了呗。那我的效率就肯定比他高啊,比前面的就有很大的一个改善了。对吧。就是使用维后的,它的目标是什么作用啊,就减少了翻译的view把IE的次数。从而来实现效率的提高。好,这个下去以后呢,大家按照这个流程给他做一下啊,你自己多写几遍,第一遍可能有点申疏啊,你写个五六遍七八遍就好了啊后面啊。
我来说两句