00:00
行,今天呢,是我们这个QQ金融这个项目的第三天啊,我们接着往下讲,呃,讲之前呢,我们先看一下昨天大概讲了哪些内容啊,来看一下这个帕零二,哎,昨天呢,我们一上来的时候呢,主要就开始来写这样的几个,哎,先是PAD01啊,几个常用的一些类啊,这里边我们写了这样的几个类。嗯,首先呢,涉及到叫my application啊,就是这些类呢,大家主要关注一下它的作用是什么啊,然后之后呢,自己在这个项目当中,哎,不一定非得是这个金种类项目了,那在其他的一个相应的项目当中呢,哎,我们也可以有类似的这样的一些做法。啊,比如说呢,首先第一个呢,我们写了一个类呢,叫做my application。嗯,这个类呢,就是一个application这个类。哎,我们知道这个系统呢在呃,当我们这个应用呢,呃,安装或者说你这个应用呢,加载到进程当中的时候,呃,系统呢,就会自动的帮我们去创建这样的一个叫application这个类的对象。啊,这一类的对象的生命周期呢,是随着当前进程的存在而存在的,所以生命周期比较长啊,然后呢,在这个进程的生命周期的过程当中啊,进程加载一直到你这个进程呢,呃,从那个内存当中,我们把它给清掉。
01:13
嗯,整个在这个进程的生命周期过程当中呢,哎,我们可以去创建相应的一些组件,比如activity啊,Service啊等等这样一些结构,那这个时候的话呢,我们这个对象由于都存在,所以我们就可以把它呢,哎当成一个容器。啊,这个容器里边的这些数据呢,就可以供你生命周期较短的这样的一些组件去使用,啊,这就我们这个activity存在的一个意义,也是我们重写它的一个意义。哎,除以它呢,我们就将在不同的组件当中啊,当然也不一定非得是组件了,比如说我们的fragment也是一样啊呃,在整个他们这个存在的过程当中,你用到的一些变量呢,或者一些数据,我们就可以生明在啊application的一个当中啊,这个呢,是对我们以后写这个相应的项目的一个一个相当一个通用的一个效果啊呃,这量的话呢,在公共清单文件当中,务必呢要配置一下。
02:06
啊,你得声明一下,否则的话呢,你声明的这个类呢,就没有任何意义了啊,必须加上这样一句话啊,这是我们说的这个application啊,下个呢,这叫UI。呃,我们在操作这个界面的时候呢,经常会有一些通用的一些方法的执行,比如说呢,我们写toast呀,呃,写view.infl呀。包括写一下这个new dialogue,然后呢,有个build啊,那个行参呀,等等很多位置呢,都需要传入contest这个参数。啊,那这个参数的话呢,呃,我们也可以把这个呃方法呢,提供在这个UI里边,通过这个方法呢,提供这个参数。呃包括呢,呃加载指定颜色呀,呃加载指定的一个view啊呃等等,包括呢,这个我们在代码层面,呃如何去写想就是呃跟你具体的分辨率没有关系的啊,跟手机的像素密度没有关系的这样的这个呃宽度值或者字体大小值啊,这样的这个方式啊。
03:06
我们都可以把这些方法呢,定义在这个UI一个工具类里面,呃以后呢,大家也可以类似的这样去用,呃然后呢,嗯,我们将这个呃客户端跟服务器交互的所有的这个URL地址,我们也单独的提供在一个类当中。呃,这样的话呢,回头我们呃测试完以后啊,你先是内网现在这样测试,测试完以后的话呢,当你这个呃应用发布以后,这个地址肯定是要做一些调整的,呃你就用不着呢,在代码里边去找一个一个位置去搜索了啊呃直接呢,在这个类当中把这个IP地址一改啊就可以了啊呃整个下边这样的一些访问的ul我们全提供在一个类当中啊。这个呢也是有一个借鉴作用,然后下边这个呢,叫嗯,是关于activity的一个,呃,管理器。啊,这个呢,呃,后边在你自己在开发中用的时候呢,也可以考虑这样的去实现啊,嗯,就相当于是什么意思呢?就是呃,我们为了方便的对于我们整个应用当中创建的activity。
04:09
啊,进行一个管理啊,其实这个我们写的这个activity的一个manager,或者APP的一个manager啊,其实你可以把它呢,就假想成就像是一个list一样。啊例呢,是一个集合了。呃,集合的作用呢,就是我们可以方便的对数据进行一个管理。啊,有了一些数据,我用list给你存一下啊,都往里边加,然后想删就删,然后指定索引的啊,或者插入等等等等都可以做啊,那我们这里边这个activity或者叫APP manager也是类似的这个作用啊,那你提供的方法无外乎也就是增删改查的这样的一些方法。啊,就是这些方法啊,就像这个list里边提供的这些方法是一样的,那list在底层,我们以a list为例。啊,因为你不同的list,它这个底层这个实现不一样啊,那a release的话呢,底层就是用数组实现的。
05:03
啊,我们这个嗯类呢,底层呢,你就是放了一个站,呃站呢是一个受限制的一个受限的一个线性表啊,只能从一端进入和出去啊,就是先进后出的,或者后进先出的这两个特点啊哎,我底层呢,就用这个SKY这个结构呢,去进行一个存储。啊,所以呢,就是呃,你的作用呢,是为了方便呃这个数据的一些管理了,那我的作用呢,跟你一样啊,就是at manager的一个作用。所以这块呢,其实没有太难理解的哈,嗯,然后再往下。再往下的话呢,我们这里边定义了一个叫crash handler,那你也清楚我们定义这个类的一个作用是什么,那开发当中呢,大家也可以这样去用。嗯,就是我们这个程序的话呢,你上线以后哈,上线以后的话呢,你如果用户使用过程当中再出现什么样的异常,这个你按正常来讲你是看不到的哈,呃用户的话,你说打印log log你也看不着,诶我们自己平时在测试的时候呢,你自己在这个呃log开当中,我们可以看到这样的一些异常信息啊,真正上线以后呢,你也看不着了,那同时呢,我们还希望呢,呃把用户使用的这些过程当中的异常信息呢,能够收集上来,那这个时候呢,我们就可以希望呢,呃用户在真正出现异常的时候,呃能够呢,把这个异常呢,直接呢,就通过网络的方式把这个数据呢发送到后台,呃就我们这后台里边呢,你可以呃专门去让一个sol来接收,这呢,我们写这个逻辑哈。
06:31
哎,这呢,其实也比较容易,就是写一个sol来接收这个sol呢,诶把这个数据呢,帮我们存到底层的这个MYSL的这个数据库当中。这呢,我看了这个MYSQL的一个客户端啊,你别觉得这是属于这不是这是一个客户端而已,哎,这里边你造个表就可以了,类似于什么呢?就类似于我们这儿呢,写的是这个注册的一样。呃,就像这里边这个注册一样啊,你看我这个注册的话呢,相当于就是从我们这个客户端这块啊,用户呢,相当于是可以做一个注册的操作啊,这个比如我们看一下已经写好这个啊。
07:10
啊,向更多里边用户注册,诶点开用户呢,可以在这里边写相应的这个数据,诶用户写完这个数据以后呢,我一点击这个注册。哎,这时候这个数据呢,就会连接这个肯定是要访问一个UR对应的一个服务器的一个组件了啊,就是我们这里边的这个,诶访问过来以后的话呢,我获取,呃,你发送过来的这个参数,就是刚才用工填的这几个数据,然后呢,呃,通过JZBC的这个方式呢,把它存到我们这个底层啊,当然这个存之前呢,先判断一下,呃,用户写的这个号码,手机号码是不是已经存在了,哎,我们这个只允许用户拿这个号注册一次啊。啊,比如说呢,就是有一些搞活动的话呢,说首单免费啊或怎么样呢,这个不能用户每次都都拿它注册啊,就能用一次,嗯,所以这个时候呢,我们就先判断一下这个后台这个数据库当中是不是已经存在一个账户了,相当于是啊呃,如果说没有存在,那就允许用户去注册啊,如果已经存在了,那就不行。
08:09
嗯,好,然后呢,返回用户一下,说是不是已经注册成功了啊,就是我们写的这个,呃你要是做这个异常的这个操作呢,其实跟整个这个操作呢,逻辑上是一样的啊呃是一样的,哎我们就希望呢,做这样的一个收集工作,呃然后呢,当收集到一定程度以后呢,呃他再把这个相应的收藏收集的一张信息表呢,在反馈给我们的这个客户端啊说呢,呃你这个嗯这个这个你咱们的这个版本是吧?呃出现了这样的一些异常,呃是什么样的机子,然后哪个系统下出现的这些异常,是什么异常,哎都有。那这是我们希望做的这个事情啊,这也是我们为什么要创建这个类的一个意义。啊,这一类的话呢,就是我们所说的一个叫呃,实现了一个叫未补货的异常的一个处理器。嗯,这其实主要针对的就是我们说的这个。
09:01
呃,你看异常我们说分成两类哈啊,一个呢叫编译式异常,一个叫叫运行式异常,这个主要针对的是什么异常啊,哎,肯定是运行是异常了啊,因为编译的那个异常,你是不是肯定在代码中写类似于串开这样的操作了。或者你写Rose了是吧?啊,当然你要是写Rose的话还是不行。哎,这个呢,就涉及到什么呢,就是哎大家关于这个try catch啊跟这个roses它的一个理解的问题了,我们说异常处理的话呢,讲了有两种方式,哎这两种方式里边cash。是真正的把这个异常给他处理掉了,相当于是是吧,就是一旦你出现异常,就按照这个catch的方式呢,去补货啊,去处理啊,那就相当于是给摁下去了啊,也就意味着这个代码如果从上往下这个执行在这一行这块呢,出现异常了,然后我给他踹了一下,包了一下开呢,也恰好能够把你catch住。就我这个异常能罩得住你啊,那就意味着在这块呢,其实得补货也处理掉了,那后边这个代码还能执行吗。
10:05
就之外的这个代码。可以吗?他还是没有底气,肯定可以啊。是吧,一定是可以的啊,就是穿下去,你把它处理掉以后呢,那事情还正常往下执行。是不是咱们讲课的时候可以举个例子,就是这个异常呢,就好比是这个狼一样,是吧?啊,这个小时候呢,咱们不都听过那个狼来的那个故事吗?这个狼的话呢,就相当于是个异常程序正常执行,就这个小孩在这个山上,在这放羊呢,是吧?哎,放羊的过程当中,突然呢,来一个狼,就这时候相当于你程序突然出现异常,然后这个小孩看着这个狼,狼看着这里边这这堆羊。然后这个时候呢,想应该怎么办呢,这就开始要考虑异常处理了,那一种方式呢,叫TRY。就这个小孩一看呢,说这个狼呢有点嫩是吧,嗯,第一次出来想下手,呃,我就可以搞得这个,呃,所以他自己呢,就把这个狼给干掉了,呃,就相当于是拆开始了嘛,哎,他他干掉以后呢,就当什么事也没发生一样,他就继续该放羊还放羊,所以这个还就接着代码往下走啊,这就第一种处理方式嘛。
11:10
那那第二种处理方式呢,叫Rose啊,Rose呢,就好比是看着这狼以后,看着这狼从眼神当中透露出比较凶狠的这个表情是吧?这羊估计损失的有点大了,他觉得自己也搞不定了啊,然后他就开始喊人了,这Rose的意思就开始往上抛是吧?然后一喊一堆人来了,一堆人来了以后呢,有可能那一堆人是不是一看也搞定了,是不是还可以接着往下再死Rose。就是这样是吧,哎都结果整个村子来了发现都都不行,那就挂了是吧,结果你往上一直抛泡抛都抛到虚拟这个层面还没处理虚拟说那那就完了,崩溃了就啊,所以这个程序就就挂掉了啊,哎,就是你往上抛抛抛,正常来讲总得在一个位置去拆开一下啊,正常你总得去踹开这样,否则的话呢,那这个现在这个狼就根本没解决掉啊。嗯,就是这样的一个意思。
12:02
呃,这就我们说的这样一个过程啊,那类似的话呢,还比如说像像这个一些人这个去法院打官司一样是吧?啊你打官司这个这个案案件哈,就相当于是这样的一个异常案件,那要么呢,就是这个法院呢,帮你给处理掉了啊,要么呢,就发现这个这个案件比较重大,说他这个法院呢,中级法院这个权利不够是吧,他就往上提交成高级法院,高级法院发现也不行,再往中央去递,哎这呢就类似于叫的一个过程。就这样的一个理解,呃,这呢是你把这两个异常的处理方式能够理解一下,呃,另外的话呢,就是这个roses呢,还要理解一个事情,就是它呢相当于把异常处理掉了,而这个Rose呢,如果在这个成语当中出现了一个叫编译式异常。哎,因为编译学异常呢,我们在代码层面呢,就是直接就爆红了哈,相当于就打叉了,你肯定编译过不去了,那我们这个时候呢,你如果用TRY。啊,那那比较根本的根本的啊,那直接这个编译式异常呢,直接就有这个异常处理的方式了啊,他就不报了,而且如果真的是在编异时出现了,然后这个时候呢,就按照这种方式去处理,也能够都处理掉,运行呢也不会有问题了啊而对于这个roses这种方式去处理呢,就不太一样了哈,Rose呢,如果我们这个代码层面,比如说我这是一个方法。
13:22
哎,这个方法里边呢,有这个变异式异常,比如我就写个L流了啊,哎,或者你写个URL联网的时候它都会出异常,哎差异出异常,我这时候呢,在这个方法这个位置写了一个Rose,那这就意味着我把这个异常呢给它处理掉了啊,只不过这个处理呢,就算是往上抛的意思,那这块呢,原来打叉,现在1ROSE发现就不报叉了。那不跑叉呢,不意味着这个异常呢,他到时候就不出现。对吧。呃,也搞不定这个问题,就是你不是你加了TRY这异常到这时候他就不出了,如果你真的有这个异常,还是会报的。啊,比如我这个加载一个本地文件,有可能报not except,这就个编译是一,那你真正到这时候,他就是没有这个文件,那该报肯定还是报哈,谁也。
14:07
不能阻止它报啊,嗯,关键就是这个报的时候呢,呃,如果是用roses去处理,它爆了以后,你编译时候看到它没有,那运行时候就爆出来了,所以说这个Rose它的一个特点呢,其实你可以理解为它就把这个异常从编译时给你加这个延缓到运行时去出现了。那就是编译时候会报这个问题,那给他延迟到运行时再报出来,这是它的一个意思,那压it呢,就是运行时还是有可能会报的。啊,那原因时报了,那就类似于呃,我们写的这个运行时异常一样。啊,这因数越多,你得能够理解我说的这个意思啊,就是编译时间长呢,你如果用穿插那个就不用说了,那个就相当于是人家已经给补货了的,我们不用管了,那如果是Rose编译的异常,那就是没有补货的,以及呢,本身就是运行是异常的,都属于没有补货的。
15:02
啊,运营时一长,前提是你你也没有加cash的哈,啊,它都是属于没有补货的,因为我们不可能在代码层面,从你这个代码一进来到最后结束,几千行代码整个都写开。啊,那你这个代码就太臃肿了哈,就是看着就太乱了,所以呢,对于运行是异常,我们一般情况下是不处理的。或者说呢,我们也不知道。啊,你只有程序跑起来以后我才知道,哎哟,这个位置报了个控制针,那你一开始哪知道啊,那如果你一开始知道了。那你不应该加catch啊?应该你把它改了嘛,是吧?啊,你这个都等于no了,然后你还说我加个拆开,说你等于闹怎么处理,那你你本来就不对是吧,对你肯定不能写no嘛,应该这样去做啊,哎,也就是说呢,真正出现了这些异常,那基本上都是我们就是说的运行时当中你还没有捕获过的那些,也就是说你没有用踹开始写过的那些异常啊,这异常的话呢,是真的有可能出现的啊,那这种情况下的话呢,哎,我们就使用自己的这个方式来补货。
16:05
啊,就是不让嗯报一个这样的一个大框了,体验不太好啊,呃,既然你能突破它,那我就可以按照我的这个方式呢去处理它。哎,那我们呢,就可以在它对应的这个回调方法当中。哎,就是我们写common里边啊这个啊,诶回调方案里边呢,我们就可以做这样的事情,一方面呢,给用户一个相对比较友好的提示。啊,这个呢,我就写个tos啊,你可以再写一个,比如也是整个dialogue什么的啊,哎,更友好一些,然后另外的情况下呢,我们可以将收集到这个用户信息呢,给它发送到后台啊,这里边呢,提到一个类叫build这个类的一个调用啊,可以获取系统的这些信息啊,通过联网的方式呢,发送给后台,这个呢就好比用户注册一样,直接就连后台了,后台呢就保存到数据库当中,呃,回头呢,再反馈给我们的客户端的开发来说,出现了这样的一些异常信息,下个版本的时候呢,就把它改掉。
17:00
啊,就这样啊,哎,那以后呢,在用的时候呢,呃,在开发当中,你就可以考虑这个类的一个使用,呃,下边呢,我们关于这个home fragment这个页面的一个布局啊,这个没啥可说的啊,然后关键呢,我们昨天又讲了一个重点,就是关于这个在view当中去加载图片。嗯,我们后边呢,在这个第二个页面当中。过来在这个投资这个页面,页面里边呢,我们下边这还是一个维护配置,这呢只不过是加载的。什么呀?这是一个。这有一个,这有一个,这是加的什么呀。哎,Fragment哎就是view配呢,典型的我们可以加载图片比较直接的,哎要么呢,你还可以去加载这样的fragment啊,那上面呢,我们这个。列出来了啊,这个图片呢,我们加载的时候呢,哎,我们呢,就是直接呢,就是你重写其中的几个方法就OK了啊,然后呢,几个小圆圈,哎,我们原来自己画,现在说不用画了,这个用谁来替换啊。
18:04
先还不是白点的是吧,先是这个view page。嗯,先加上,哎,我们这个叫呃,View page indicator是吧,具体的话呢,是这个框架里的,呃,Circle page indicator对吧?哎这样的去实现,而且非常简单啊,直接就把这个组件呢,在那个布局文件当中声明一下。嗯,然后直接呢,回来以后给他塞,呃,这个view page是吧,就可以了啊,使用非常简单,然后呢,我们接下来又讲了一个就是banner。啊,所以说呢,就是你不用班ner的话呢,不用黑加上它啊,这是一组搭档啊可以使用了,然后有班ner以后呢,哎,我把这两个都干掉了。嗯,直接呢,是封装了一个banner啊,用banner来实现的。白里边其实底层也是封装的。他们。啊,也是封装这个view配置的,只是说呢,我们实现起来就更更直接更简单一些啊,这是我们昨天最后讲的。
19:00
这个呢,就是我们直接嗯粘过来,相应的做一些调整修改就可以了啊,最跟我们写这个联网框架一样,使用框架的目的呢,主要就是变,就是开发,提高我们这个开发的一个效率,同时呢,它提供了更加丰富的一些一些效果啊,当然这个效果你要是不用人家的话,你就自己写啊,相对于就是周期长一些啊好,这个呢是我们昨天讲的,嗯,接下来呢,我们就说下面这内容了。
我来说两句