00:00
来,我现在把它做了,做了,我们来运行一下,看看我们现在的一个问题啊。啊,如果你不怎么动呢,它是也是没问题的,你要是运行,你要是滑动比较慢的时候,其实问题不大,但你快速滑动的时候。啊,它就会存在一些问题啊,问题的一个现象呢,就是图片有闪动的情况。那好啦。我们来看一下啊。有闪吗?是不是闪的好,现在我们就来去看一下,来通过这个图来看一下是怎么在闪动的啊来。嗯。
01:00
我这么说一下啊。我复制一个。I see。把它放在这里。裤子。粘贴好看着啊。在这个里面啊,我们来看一下,现在呢,我们的F4这个图片是不是已经要显示出来了吧,它它没显示是不是正在准备去加载出来。但现在我问一下大家,那个线程正在运行吗?一定正在运行吗?不一定,对不对,也就是说我们要得到它,肯定会调用get view吧,好。我们来看啊。完了,用一根线来来来去,依次的往下去走啊往下走来,现在呢,我们去调用了一下get of you。
02:06
啊,调用一下get view里面呢,假设当前的有一个下标是吧,假设下标是几了,下标就是。五吧,啊,下边是五好了,还有一个。这里面呢,有一个有会有一个有一个视图对象,Convert what of you。嗯。好,我们去调用这个方法的时候。又掉了哪个方法?好来啊,诶又会去调用那个load的方法吧,我们来看一下啊,调用的是它,我把它一一步一步都写一下,叫get,叫image load image no.no image是吧。哎,我我我们这里传的什么URL。
03:04
In加U呢,就是那个呃,F4。点什么JBG吧啊还有一个是谁imagine you是吧,好,这都是在主线执行的吧,现在都是在主线在执行啊记住了好,接着这一个方法又会调换另外一个方法。我们看这是这款鞋具。啊,我们就一级缓存二级缓存不管了,因为它确实没有得到数据,对吧,是不是三级缓存呢?啊叫get啊from third catch对吧,船的应该是什么呀。是我们上面两个参数吧,是不是F4.jpg,我就直接把值写出来啊,也不写值了,看不太清楚,好了,Image view也是这个image view对象吧,好了,这一个方法也会很快的执行完吧,在这个方法内部我们做了个什么事?
04:08
是不是启动一个义务任务啊,那实际上就相当于是不是启动了一个线程。啊或或者说启动一个任务,任务来看一下,我在里面写一下啊,你是你了一个a think sy nc诶asyc是吧,啊think task我是不是这么做的,嗯,点huge是不是启动了,但启动了以后它的那个doing background方法是马上执行吗?不是吧,就线程是启动了对不对,但是并不代表它立即执行吧,他可能过段时间才执行对不对。好,那过一段时间执行,我就假设先先给他画,先给他先给他整着,我不写啊,他可能要启动一个分线程。
05:01
啊,但此时还没执行吧。下面我们继续往下,继续往下,我会做一个动作,我会干嘛呢。向上滑动。那向上滑动我的这一个F4这一行,它是不是会进入那个看不见的区域,那进不进,进入看不见的区域,它会做什么事?他会这样把这个拿下来。看见C,看见V拿下来是吧。去重新调用新再调用get view吧。而且你这个时候它想显示的图片是什么呢。嗯,来,我把它改改啊,大家看到这一个PD说假设是FF f10吧。假设是F10啊,你F9了嘛,假设是F10可以吧,好,你来看这个里面主线程在做什么事情。
06:00
要什么码?大家看啊,是不是调用get view啊,又会去调用get you对不对,里面传的是几啊,这个下边五的话,五六七八九十十一吧,对吧,11好了,传的那个convert view是谁呀?是新的还是上面那个,就是上面这一个。对吧,也就是说他们俩现在是什么呀,是不是同一个。试图对象啊,他们是同一个的话,那个image view是不是同一个啊,自己记住了是同一个,他们是同一个啊,OK,好了,这个方法调谁去。一样,跟上面是一样的,对不对,好来看啊。呃,它呢,它很简单,又是跟上面一样的去调用什么image load.load image可以了吧,里面传。
07:06
传什么f10.jpg吧,好了,这次传的image you是不是跟上一次还是一样的,是同一个吧?这个能理解吧,就是同一个视图对象。嗯。他们这个也是同一个啊,你这个一定要记住,它们俩是同一个。因为他们俩是同一个。但现在这个这个传的值不一样了吧。好啦,哎,我中间有一个事情没有去给他说出来。啊哦,还没做呢,我们等会再做啊,还没还没写来看到这里,好,下面我再去一次往下,这都是在主线程执行的啊,记住了,你一定要记住我们这条线是主线程的主线啊,它呢去执行我们的下面的依次往下,大家能看得出来叫啊,Get from third cash对吧?传的还是我们的这个f10.jpg大家看啊。
08:12
传一个image view,我们再去调用这个get view的时候,我的主线分线程一定执行了吗?一定要记住啊,是不一定的吧。还没有执行,记住了,我还没画,还没写他,我等到我写他的时候才证明他执行呢。啊,有人说怎么这么久还不执行呢?你快速滑动,它就很有可能不执行,因为我启动的线程特别多。OK好,下面来啊,一直往下啊,它呢就会又去这个就到了关键地方了。这个时候我是不是去溜了一个,又溜了一个业务任务啊,啊think task啊,溜了一个业务任务去执行对吧?啊,就启动了一个,相当于启动一个分线程,准备去执行一个分线程。
09:10
啊,到外面来执行好了。他先启动吧。它后启动是不是。是吧,好啦,现在我他先启动,他先执行的几率应该很大了吧。那很正常对不对,我先启动,那自然我先执行的几率很大,那他会去执行谁呀。就是那个方法doing background对吧?啊就那个方法,我在这个方法内部是怎么做的呀,是不是根据我我拿着哪些东西去做看他我是不是先拿着我的什么F4.jpg去找这个图片呢?是请求它呀,是吧?请求这个路径吗?对不对。
10:00
那我请求这个路径以后,我是不是得到这个图片以后接着干嘛呀,是不是image view.set image啊给它设置进去啊,那你想啊,现在我是不是会把这个F4.jvg给它显示出来,那你说现在我就相当于本来我这前面看到的是呃F4的商品信息,现在看到是F10的商品信息吧,它显示图片是什么图片。F4.jpg啊。对不对,现在这一个是不是已经隐藏了,已经没了。啊,已经看不见了,变成它了。这个地方大家看到啊。那后面你是不是又会跟他一样啊,跟他一样在这个里面啊,去做这个事。大家看啊,往下滑一点,嗯,就这个是只是呢,我们现在啊,我们现在不是去找F4了。
11:03
对吧,我们现在整的是是不是F10啊,那很简单,就请求F10啊,这个是对的对吧,这个对的啊,请求F10最终把它显示出来对吧?好。Set image,好,这一个请求和设置之间是不是要有一点时间距离啊?也就是说是这样的,大家看啊,我呢,请求以后啊,请求到设置了,它是有一定的间间隔的,它是要回到什么线程执行,是不是主线程来执行呢。啊,回到主线程来执行,这个地方大家看到啊,实际上是回到主线程来执行,对吧?啊是这样的一个。一个概念,好了大家想。现在是不是就出现了图片闪动的问题啊?那怎么解决了?
12:00
大家看啊,我们后来说解决的方式要三步。第一步就是在load image里面我做一个事情。就是在load image里面,我我写一行写一行代码,就在这个里面,我就写一行代码叫image view.set t,那set t现在设的谁F4.jpg是吧,前面还有一个路径我就不写了啊下了吧。好,那看到这里,我这里在这里看看看看到我这里啊,这个呢,是确实是看怎么去,但是他一直还没做对吧。好,执行到这里,我们这个地方又做了一个事啊,在这not image,他做了什么?imageview.tf10.jpg吧,是吧。
13:01
啊,那也就是说此时此刻那个image view里面的T是变成了f10.jbg了呀,f10.jbg好了,大写。啊,此时我跟大家说,我们的这一个对background执行了吗?是不是可能还没执行。可能还没执行好了啊,准备你也会启动一个新的线程啊,新的线程去做好了,大家来现在看,如果在它之后啊,在这个方法之后,我的doing background执行了。我的对用半挂来执行了,那你想。我现在看到的是不是F4.jbg和image view啊。那我现在如果说从这一个image view里面去取。大家看啊,我在这个中间去,在这个请求之前,我先去做一个事,叫image view.get t,这一个得到的是什么,是什么值。
14:03
是f10.jpg,这个你要知道就基本上就OK了。就是说首先你要知道我们image view.get得到的是f10.jp,没问题吧?你看嘛,明显已经变了吗。对吧,但是你看到的这一个参数还是什么。是F4.jpg啊,它是一个什么类型的参数还记得不?是不是老了呀?这是一个的变量。看到了吗?Final的变量以前怎么说来着?是不是不能改变?这个不能改变,估计很多同学都有一个错误理解,就是不,你不说不能改变吗?怎么就变了?啊,你不说的变量是不能改变吗。谁不能改变说的变量不能,变量不能改变,知道吧,什么叫变量不能改变,你说。
15:06
找个人啊。刘成龙,你说一下。啊。引用物变,啥叫引用物变啊,这个以平常可能就这么说啊,譬如说我定义我们就这里翻了,翻了十句啊翻了不是比如说不来个波程嘛啊随便来一个变量啊啊P它等于一个什么值啊,这个final引用变量引用不变是指什么呢?那从内存上来说是指什么意思呢?嗯,差不多,好注下了吧,差不多啊,那我说一个看看大家应该就能理解的非常非常明白了,我们内存里面是不是有一个堆空间,有一个占空间,这是占空间,这堆空间是吧?我们的引用变量是不是在这个里面呢?一个变量是不是就一块内存区域啊。
16:06
是吧?啊,而P是什么意思?P只是这个内存区域的一个代号吧。是这意思吧,就它的代号以及它的标识。对不对,好,这个这个里面是不是存了一个值啊。这一块变量,一块内存里面存了一个值,那个值呢,跟大家说一下,一块内存里面可能存的是真实的,就是一般的数据,也可能存个地址的数据,有两种数据。一种叫地址值数据。啊OK,地址值数据,还有一种呢,是叫基本的数据,譬如说我们存一个存一个数字啊是吧?啊,基本的一般的数据啊,就是非地址是数据吧。OK,好,我们的这个P存的什么数据。是不是地址数据,不管是什么数据,最终它是0101对不对,是它的格式呢,比较特别对吧?啊,假设它存的是零一。
17:01
我这个零一呢,它是个地址数据,它是不是能找到我们的一个对象的区域啊。这是一个内存区域,这是我们的你们对象,对象里面是不是很多属性呢。对了吧,什么叫final呢?非常简单,就是它的地址数据,它里面内部的数据不能改变。不能再修改了。能懂吗?就是这块内存里面的内容是不能再修改了,那你不能再修改,你还能指向别的对象吗。不能了吧?能听懂吗?啊好。下面那你说我这个final final类型的PP等于六来1PERSON,那也就相当于说我这个P只能指向这一个对象吧。但并没有说我的对象能不能变吧,对象内容能不能变,当然可以。对吧。比如说我的对象里面的数据咔嚓在变行不行?
18:03
当然可以。他有没有说他是这个坏了,是不是在去说他呀。是不是?又又不是说说的他什么的,又没说他的内容不能改变。是说左边的这个内容不能改变,又没说它的内容不能改变,对不对。好了吧。嗯,那也就是说我们一直看到的这一个,大家看啊。我执行这个方法的时候啊,传入的是啊f1.jpg。啊,那F或者说F4.jbg吧,因为我们现在F4.bg,等到我的对应的doing background执行的时候,他看到的还是什么。是F4.dvg,其实他看的还是image view也没变,对不对。它的这个这一个引用变量变了吗。是不是也没变呢?但是他所指向的这个对象的内容。
19:01
是不是属性改变了呀?而我们就已就是说我们现在去通过imagine.get t。是得到它内部的内容吧,那它的内容现在就变成什么了。f10.bg,那我看这一边的参数还是F4.jbg。那就说明imagine you想显示的是F4还是F10啊,肯定是F10嘛,对不对,那我还需要去请求吗?不需要了呀。对不对。这是一种情况啊,还有一种情况就是你此时比较了,有一种情况啊,是可能他们根本就我滑的比较慢的时候,它不是有可能没变呢。就在这里,在这个啊,在这里比较的时候它没变,但是我们说过了,我们从请求到它设置之间,这一个中间是不是有一点时间间隔呀。
20:01
跟上面道理其实是什么,是不是一样的,就如果说你在分线消耗了一定的时间,那我的主线程就可能对这个视图是不是进行改变呢?那改变了以后那一样啊,你就要取消。显示。一个是取消请求,一个是取消显示。就这样的一个事情,大家需要去知道啊。嗯,我把这一个给它搞到下面那页。也就是说在这个中间我也有可能啊,大家看到是这样的一个意思。啊,有一种可能性呢,它是这样的,在这里面在在上面可能看到的是F10,也有可能看到是还是F4吧,那我继续发请求了,那中间呢,我就会去发请求,等到我发完请求回来的时候。
21:06
猛然发现。视图的内容,视图的tag已经变化了,那那个时候我就不应该再请求了。啊,它应该是这样的一个啊过程。啊先呢去看一下我的比较它啊接着呢再看它,接着呢再再等它。嗯,是这样的一个过程。嗯,在这两个点上面都是有可能是f10.dbe的。啊,或者都有可能不是对吧,那个时候你就直接显示就行了。这个里面主要就涉及到大家很多时候不理解呢,还是对主线程呢,这些线程的内部的一个运转不是特别特别的啊,熟悉导致的一个问题。
22:04
嗯,下节课呢,大家自己也要多分析一下,有些同学就是不懂的,以后呢,嗯,他有些同学在分,自己也在分析,那有些同学就直接就放弃了。
我来说两句