00:00
谢谢,谢谢,看着。照这个做呗,来。现在我们就是要去动态的去显示图片,而且要用上三级缓存,这个代码量呢,不是一行两行代码能写出来的,在这里面呢,我专门去写一个类。来,去做这样的事情。呃,我们呢,写一个什么类呢,就有一个叫big map。Manager或者呃,就这个吧,有一个很好的一个那啊叫什么意思,图片加载器是吧?嗯。有这样一个类。它用来干嘛的呢啊,用来用于加载加载图片。并显示的。类好搞好了吧,搞它以后我们来看怎么样用它啊,它这个里面呢,我们要用这个类的对象来去干一件事,那先在是不是得想办法创建这个类的对象吧,啊,先把这个对象给创建出来再说啊来我在这里面声明一下private。
01:21
导个包imagine,它这里面还不提示啊,Imagine no啊,我需要有一个这样的对象就够了,怎么做啊?我是不是可以写个勾的方法啊,来去做一下,在需要有一个对象去整啊,来个它好了,Imagine写一下,等于六一个image load先写着啊,等会需要什么我们再说看看。来in my,在这个地方,它应该有一个方法。
02:01
叫什么呢?Load的可以吧,你传什么过去了?大家说ul。来把这个UI是不是传过去啊,还有吗?你就这样整个它,它是你说这个方法能马上返回吗。不。是不是不能啊,那不能的话,你就需要把我们说过了,这一个类是用来干嘛的,大家看啊,它有两个,一个是加载图片并行吗?显示,那你显示的话,你可告诉他什么东西。是不是我们当前的image啊?知道吧,嗯,反正由你去做,我不管了,这意思吧,这个get view不用去管,你什么时候会显示,他不用管。好,那我要把这个方法给他什么呢。
03:00
整出来。是这个意思吧,好。来啊,下面我们就准备去写这个方法。加载图片并显示来,把这个流程给他拿过来,不看流程那谁也写不了啊,然后这个流程。看下C。来看,放在这里。现在我们的image pass是不是相当于有它了,有这一个地址了。嗯,有这样一个image view也有了。下面我们的第一步。是不是他呀。就这一步对吧,好了来,我把这一个呢给它copy在这里。照他做啊,好在这现在看第一个。根据ul从一级缓存中取对应的bit map对象一级缓存我们说是一个什么缓存,内缓存用什么结构存呢卖,那我是不是得外围得有一个脉的结构啊。
04:12
对吧,啊,这个前面不是在说吗?我们的一级缓存是用这样一个结构存的吗?那你这个地方怎么做。Private怎么?是不是也有个map map的K使劲map的value,这bit map呀,啊,Bit map在了吧,好结个什么。好,我们叫啊,叫一个起个名字啊,叫开始map吧,开始是不是要有一个空的容器放在这里,准备好啊。没问题吧,嗯。这一个啊,用于缓存啊map诶的容器对象好了吧。
05:12
好,下面你看我该怎么做了。我这地方啊,我就专门去定义一个方法来做到了,你别在这里写了,我最终是不是想得到一个bit map。没问题吧,我这边写这样的一条语句,看大家能不能理解啊,Be my等于get,呃,Get什么呢?Get from。First。穿什么?是不是穿他呀,嗯。这是个什么意思啊?从什么一级环境中取谁b map,你也可以写get b map,只是说这样写的就是方法有点太长啊,有点受不了了。
06:00
好,我把它呢给它拿过来,这一个就是从一级缓存中取啊,根据图片路径的图片的ul对吧,图片ul啊从什么呢?一级缓存中取对应的变map对象。对吧,其实这个方法倒很好写,但是啊,必须把它定义成一个方法,让大家看到这个流程。其实非常非常之得之简单,叫开启map.get。传一个。Might pass。就可以了。对吧。嗯。啊,其实就这一一条语句,我也专门去定义了一个方法,让大家看到我们先是从一级环中取好了,下面看这个怎么做翻译啊,现在大家做的就是翻译bit map不等于空,那我就干嘛,那我就显示呗,Imagine you.third image bit map,传一个必麦结束,怎么说拉倒对吧?
07:30
下面是不是进入第四。是不是这一个呀。做呗。来看到这个地方,我们来看一下。来做从二级化成取,是不是也是要得到一个bit map?好来看到bit map等于get from second catch传什么?
08:04
还是一样,你先把这个东西传过去,他该怎么着怎么着。对吧。嗯,这个时候我要把这个方法呢,给它做出来。嗯,这又定义了一个新的方法啊,这个方法呢,是啊,也是根据图片用量从二级缓冲去啊,就这样吧,写一下啊好。下面我们来看啊啊,我我呢在这里面先,我们要知道我们是不是在SD卡里面去找啊,那个位置大家一定要清楚我们的位置在哪里看一下啊。这个里面是吧,嗯,要知道位置了我们才好做,不然的话就不太好做了啊,位置在这里。好。来,我怎么去加载对应的位置的图片呢。
09:01
嗯,先你是不是要有这个路径才好做啊,那路径怎么的,先这个路径好的吗。嗯,看看这个路径来这个怎么做呀。这个地方哎,需要有一个什么呀,这个地方必须有看太子才能做得了,你传过来了,谁传呢。你是不是有需要contact的呀?有了contact才好做,那怎么办?那说明我现在的是不是要创建对象的时候,要指定一个context的呀,那也就是说要是这样的,大家看我这个地方必须得有一个context,那我这个里面呢,应该有一个成员变量。人传入什么?看吧。
10:00
你说到时候传的是谁呀?是不是activity就可以啊?好,我们先不谈,先别管它啊,如果有了这个context,看我怎么写。Context get exter,对,这谈个什么?那现在呢,它是一个feel,我们得到它的是不是绝对路径呢?嗯,对,路径好,有了这个路径以后还不够啊,这是fairs的路径对吧,现在是fair pass下面我们后面是不是加上文件名呢?那我们要得到那个fair name怎么得。哎,我是不是来看着他,那我的这一个路径是不是要截呀,看着这个路径,路径刚才我在哪放着的看着啊。
11:01
在这是吧,得看的路径拿过来看一下。你得看着做这东西吧,我看着做不太好整,是不是有他呀?嗯,来看怎么个解法,Imagine pass。点沙四句从哪开始截,从最后一个斜杠的后面,是不是截他呀?那你了解他这个怎么找呢?我先写出来吧,有一个叫last index of,写个。但这样呢,不对啊。他会截出来这一个。这对呀,啊,这个有人说你后面想现在啊。那是因为你后面是我现在要的是文件名。那就不对啊,你带斜杠啊。你是想利用这个斜杠,到时候直接拼是吧,嗯,大家还是别这样了啊,来加一个什么一,这个时候我们得到的就是一个它。
12:13
是吧,当然就是F10点接BG,而后我们前面呢,得到的是这一个啊,得的是它。嗯,大家能看到啊,好,下面应该好做了吧。现在我们的那个fair pass是什么?Fair pass加上一个斜杠,再加上fair。就这样子吧,好,有了它,我如何来产生一个bit map对象?又用到一个类叫bitter map factory,它有一个方法叫抵扣的方法,你说他这么多。
13:05
重载的方法,我用哪一个呢?就这一个。穿谁呀,不要怕。对吧,但是这个疑虑有吗?不一定,因为有可能是没有保存过呀,啊,他这个方法很好的啊,如果没有大家看到。返回什么返回了对吧,现在我们就把这一个给它写好了一下。啊,好,下面。来继续往下做啊。好,B map已经取了,下面就是要做一些判断了。看到没if?如果bit map不等于,那那就说明是不是得到了呀?得到了我做什么呀?
14:00
Are imagine with the center。Imagine bit,一个get map。还有一个事情。缓存到一级缓存呢?来怎么做叫开启map,点哪一个可。Imagine,什么?Pass,哪一个value map好了吧,下面不是说结束吗?好了吧。好了,那下面一旦进入了,下面是说明没有吧。没有就要进入我们的。三呐。好。哪个他。
15:00
嗯,这是三。好,进入我们的三得做什么呢?看到显示代表正在加载的图片是我要显示的默认图片呢。关键默认图片在哪呢?好,这个时候我要去做一张图片。很简单,做图片,So easy。啊,这个地方来啊,我们就要就想自己做一张,这个呢叫什么呢,叫loading楼顶,我就突然间不会写的了,是这样写的吗?哦A是吧。啊D有没有两个呀,还是一个呀,一个是吧,好来。下面啊,Lo在了在了以后呢,呃,截个图,不要笑啊,笑啥了。
16:03
来看它。啊,截个图就OK了,嗯嗯就可以了,好,应为。这个叫loading.png好了吧,那有loading还有一个图片。还有A。啊,A的图片。好,还有呢,也来结账。就这么解一下啊。嗯,差不多,嗯,好了,来你为一下。L是不是得整个红色呀。对。追求还比较完美啊,来整个红色。好,嗯,字体是红颜色的。
17:05
好,没有红包好了。有点像橙色是吧,来这个是橙色,哎哟。好了吧,好了啊。来这两张图片。都给他搞进来。放到我们的项目里面去。可以了吧。好。来试下。第三步。显示一个代表正在加载的图片,这个图片呢,其实这是一个工具类啊,这个工具类呢,是可以反复复用的,我们的图片,你你要显示图片其实很简单,就image you,我先给他写一下,点set image。
18:15
Bit map是吧,那来一个R点点。叫什么loading吧,但是你在想这个应该要调用者来去指定。就是如果你这么写也也是也是可以,诶说是吧。也是没有问问题的,也并不是特别大,但是呢,这样在真正的项目中是不会这么做的,应该怎么着呢?通过构造方法啊,由调用者来传过去,来一个默认的图片和一个错误的图片。我它指定什么,我就显示什么。我作为一个工具来说,我是不能直接把这个图片给他去指定的,对吧,这样呢,就是太死了写的。
19:02
啊,也就是说我们这里面可以去干嘛呀,定义两个图片,一个叫什么呀,叫lo啊那个。Image get map这个写个什么呢?Loading image is。资源好,还一个是什么呀,I吧I image is。或者说他ID也行啊,啊,这个值怎么指定的呢?通过什么是不是构造方法来指定呢。这样调用人就必须得传过来。能看懂吧,嗯,好。搞定来。下面我就不用去写一个死了,直接找什么叫lo。
20:03
Imagine resource,好了吧,好吧,下面啊,我们来看。下面呢,我们要去启动分线程。去做了,好,这个相当于我们是需要去啊叫no,嗯,Bit map not image not bit map from叫几级缓存呢?三级缓存对吧,叫什么色catch,嗯,这个catch传什么过去了。大家看啊,我把那个首先肯定ul肯定要传过去,对不对,你pass我跟大家说啊,这他是不是要启动分析数据啊,显示也归他负责。我把哪个弹过去。是image view有传过去啊,就它,但是它加载它显示就得了啊。
21:04
我就不管了。可以吧,嗯,可以好了,来看到我把这个方法呢给大家建出来。就像并显示啊好来看一下。啊,这个呢,要去做啊,还有点路途有点遥远啊。好的,这是一个图片路径,这是一,我们先要根据这个图片路径启动分析的去做。这一次我们使用一下think的吧,试一下啊,我们这一次我们用一下看怎么用又一个a think task。对吧,好,我前面呢传的是什么呢,Word我也没什么不需要写的什么进度吧,不要什么记这个result是什么。
22:11
结果我结我得到的结果是什么?是不是b map对象吧,这个能懂吗?啊能懂是吧,来实现它里面方法,接着把这个任务给他启动起来是吧?执行在这里面我们说义务任务一共是三步,对不对。第一步,我们需要做什么吗?我们要显示什么提示视图吗?不需要是吧,那如果你想做那也可以,想做的话,你就去把那个,把那个事情先搬过来,把那个刚才的这个。是不是给他搬过来呀。啊,在这里面做能看到吗。是吧,这么做可以吧,这不显示一个提示图吗?还挺贴合语境的是不是,嗯,好,下面。
23:04
来看啊,除了这是第二步,还有一个第三步,都把步骤先写出来啊,Post可以了吧?好了,下面我们来看一下这一步怎么做。再一步就是我们要联网请求。最终得到一个什么?Bit map对象啊,看到联网请求得到bit map对象。那联网那不就是整呗,这里面有有地址啊,怎么做啊,还是那几步啊,把先把步骤写好好写点得到连接接是什么呢?设置接着连接发请求是不是读啊。嗯,读取返回的数据并嗯嗯封装为什么呢?是bit map呀啊,简单的写,就这么写好了,来。
24:13
呃,URLURL等于六一个ul。传一个image pass,好,必须是一个final类型的,嗯,这里面是不是有异常啊啊异常给它揣起来吧。Run却开启。好,把这个放大一点。好,这样啊,我把这个写一下,最终肯定是要有一个bit map对象的,这么写一下,最终返回的是bit map,中间要想办法给它赋值。好,来设置啊,没有得到是吧,连接都没得到了,用l.open一个链接返回的是一个http ul connection好了吧,全转。
25:18
设置它本来就是个get的请求吧,那我们不需要设置请求方式啊,主要设置set一个连接超时时间,比如说5000。对吧,还有一个设置一个读取数据超时5000。好了吧,下面连接connect,嗯,好,下面我们要发请求,发请求的话我们要写什么数据过去吗?不用吧啊,就是请求一个图片,没有什么参数需要写,这个地方还是要判断一下先得到什么呀,响应嘛,对吧,看那先点get response code response cold if,如果response code等于200,我才去想办法去读吧。
26:19
来得到一个什么牛了点,Get input好,这里面有一个is,我们要想办法把这实际上是一个什么流,是不是有一个图片文件输入流啊,图片文件流对不对啊,那我们怎么样把is变成什么。Bit map将is封装为bit map。这个通过谁来做呢?Bit map factory好看,有没有封装的?
27:05
是不是他呀,传一个is返回的就是。是吧,好,干完这个事以后呢,适当的要做一些释放的工作,嗯,比如说我们的牛is.close我们的连接连接点啊,第一次connect是不是断开呀。好了吗?好了啊好,最终呢,我们是不是就把B得到返回了呀。好,下面。在这个,在这个得到它以后呢,还有一些事情需要做,大家看到啊,我们的这个流程。大家看了啊,启动分析得病的map我们已经搞定了吧,大家看如果没有显示一张错误图片,这个在得在哪个线上做,是不是主线在呢?哎,我把这个事做一下,大家看看啊,这个是该怎么做。
28:09
看着是不是应是这数啊,这个长度来这一个,那这就是那个bit map,我判断一下呗,E,如果对了白不得空,那我就imagine view.set image resource。写什么I image resource可以了吧,嗯,好,继续往下看看它有什么,如果有需要去干这件事吧,嗯,这边说一个事,这个显示必须在主线的吧,我这一个了。我们可以在分线做,因为这个时候保存它是不是也要点时间,我们这个这两个这一个呢,可以在什么分线程做对吧,这一个也可以在分线程做,但这一个必须在主线程。
29:08
对吧,嗯,我们先可以把这两个事做了。那。在这个地方大家看啊。我要做这两个事。那你是不是要判断一下呀,判断一下的好,Bit map。不等于,那那我就可以去。做这些是吧。嗯,来做呗,首先缓成到一级反程,这个最简单的开map.put try一个image pass try一个们,但是要保存到二级缓存就不是那么容易了,大家看啊,相当于说麻烦一点,怎么说呢,它有一个压缩的方法。就压到某一个里面去啊,这个呢是压缩的格式,来看一下它是什么格式了,有jpeg和PNG用的最多,Jpeg上有个概念,我不知道大家有没有概念,叫透明度,大家知道透明度吗?啊,知道吧,好,那个如果你是JPG的格式,那是没有透明度这个概念的,那如果你是PNG呢,是可以保存透明度的数据。
30:26
嗯,这个你随便选啊,对于我们来说不太重要,我们就选择其中一个就可以。好,假设我选择JPG吧。这个是什么?质量?那什么叫质量呢?其实大家一看就知道。零到100什么意思?压缩,什么叫压缩啊?这个地方如果譬如说假设写个50什么意思,本来它的文件大小假如是100K,就变成多少K了,50K就这个意思吧,嗯,就是啊,比例压缩的一个比例是多大啊,我就写个100吧。
31:09
好,下面你说这个什么意思。我把这个数据压到哪个牛里面去吧,那我想把它压缩成一个图片,你说我要创建一个什么牛,留一个fair,什么妞,Out put string,那关键现在是不是有一个fair对象,或者要有一个路径啊,路径怎么的啊,刚才是不是得过一次啊,前面写了这么多代码,最终就是为了得到那个文件流。是这个吧,嗯,就他。我有他吗?是吧,嗯,大家看啊,现在呢,我们就把这个牛,哎,我简单直接就把这牛直接传过去得了,传一个。
32:01
不要怕。就在那。好。来啊来看这样我是不是就做好了二级缓存吧,一级环节也做了,二级环节做了,下面还有我剩下我们的最后一步。干嘛?imagine.set。你妹的。Bit map,传一个bit map。就搞定了啊,也就是说如果有就写是呗。是吧,到此为止了,那就整个就整完了。啊,现在现在就是一个测试时间了啊,希望他一下子能中。来还有这个给它整一下啊,构函数哪一个,这个是main activity.this还有loading的那个R点点load对吧,点点。
33:20
好了吧。嗯,好了,来啊,诶这个地方还有一个东西需要写权限。叫写。Right。嗯,好了吧,嗯,好。关键时刻就要到了啊。这一上来就什么呀,哎,怎么一上来就L了,来我们先看一下我们这个船的数据有没有传,对啊,先看一下我这个地方传的这个是不是传反了哟,来看一下啊,我第一个二三是loading是吧,看一下。
34:12
是六零吗?没问题,好了,来TP。看一下在这个里面呢,在这里面我们是开始给它显示了一个loading,怎么能这么快呢,HTTPS。H。什么hsp哪里啊,往上滑,这个里面搞错了是吧。是不是一请求就不对呀?这里火眼金睛啊,OK,来啊。好了,估计他刚才就想说了。正在楼顶是吧。
35:01
是不是都在显示的。啊,可以没有问题是吧,但是这一个要快速跑动就会有问题啊,现在还没解决真正的问题,大家看了啊,会一位,你看显示了一张图片,显示了一张图片是吧。等会啊,大家就能看到问题。他还在家的。什么问题啊?那那图片图片是不是在那闪动啊啊,这是一个list view里面去用三级缓存。必然会碰到一个问题,就是图片闪动,就是你看开始显示了A图片,后来又显示B图片,后来又显示C图片是吧,搞不好最后显示图片还不对啊。后面我们再说怎么样去解决什么原因导致的,对吧?嗯,现在我们能显图片肯定是能显示的,对吧,而且是动态显示的啊,没有什么太大问题,这一个应该说是迄今为止啊写的最有技术含量的一段代码。
我来说两句