00:00
诶,下边这个呢,也是一个比较有用的一个类啊,这个我们在前面的项目中应该是没有见过了,诶我们提供一个呢,叫crash handler哈,嗯,这个是要干什么呢?我们说一下它的一个必要性息。哎,这个呢,应该不陌生吧。就是我们手机在运营的时候呢,经常是不是就容易出现这样的问题啊,那这个问题是什么造成的呀。就是出异常了吗?说白了是吧,而且这个异常呢,是你是处理在代码当中,你是处理过这个异常还是没有处理过的。哎,肯定是没处理过的啊,你没处理过就报了啊,如果你要是用try cash啊,这样给处理掉了,那他其实就不报了啊嗯,所以说这你看这里边说明我们在测试程序的时候呢,如果程序出现异常,而且这个异常呢,你还没有处理,他就会报这样的问题,整个程序呢,现在就挂了。啊,那这个时候呢,我们有两方面的需求啊,一方面呢,就是如果这个那是测试的,那还好,你在这个log cat当中,你可以看到它是什么异常,把它解决掉了,那真正在这个开发,呃,这个你产品上线以后啊,交给用户去使用了,那用户的话呢,在用的过程当中,突然爆出这么一个框来,然后紧接着成绩就推出了,那再一进来还报,那接着他再做一件事情呢,就是把你卸掉是吧?呃,所以首先给用户体验比较差。
01:24
啊,这是第一个问题啊,再一个呢,就是我们都已经上线了,然后呃,我也不知道这个就是我们测试的时候呢,用好多不同的机型测试也没问题啊,结果呢,就是某一些机型特别的,他就报这个问题了,但是我们如果说不想办法去收集这些用户信息,那你也不知道他有什么异常。啊,就相当于比如我们测试的时候呢,我们拿好多进行测试,真正这个上线以后发现,呃,有1000个人啊,假设1000人在使用,结果其中呢,这个十个人报过这样问题,那你得想办法把这个他报的这个异常信息给收集过来。啊,就相当于他一报的时候,最好呢,这个时候在他这个手机上能够发送一条信息,把他出现的这个问题呢,发送给我们的后台,然后后台呢,专门造一个相当于在数据库中造个表,收集这个用户的信息,那回头这个1.1版本完了以后,回头一看,发现有好多人提交过这个信息,当然这是系统自动提交的哈来我们发现其中呢,报了哪些哪些哪些异常,而且呢,我们还能看到这个设备是什么什么什么设备啊,包括他用的是哪个安卓的系统版本,都能够统计过来,这样的话呢,我们就可以有针对性的来去解决这个异常的问题。
02:34
啊,这是两个事情啊,第一个事情呢,就是给用户的体验不好,然后呢,最好呢,就是也可以报啊,但是呢,你最好这个友好一些啊,这是第一个,第二个的话呢,我们希望这个异常信息呢,呃,我们还可以去在后台收集,便于我们在后边不用推这个1.2版本把这些bug呢给解决掉,所以我们经常也会看到一个新版本推出的时候呢,关于这个介绍里边会说,呃,有的简单一点说,解决了一些某些页面的bug,那有的呢,具具体会写明是哪些页面哪些操作上的bug。
03:05
啊,那这些信息他怎么收集到的,那一定是报问题以后呢,他后台是可以看到这些信息的啊,那他是怎么做的,这就我们要说的问题。啊,就是这个类的事情啊,啊首先呢,我们系统在出现异常的时候啊,刚才我们也说了,是你没有处理的情况下。啊,你要处理的他还不报了啊,嗯,那他报这个错其实也报,报这样一个框,其实也像一个dialog一样啊呃,是系统呢,它底层有写好的一种机制,一旦出现。准确的说应该叫出现未补货的异常时。呃,报的这样的一个框。啊,那补破了他就不报了啊,那我们这里边先来演示一下这个问题,在我们这里边,比如说我们这个mayi啊,Mayi呢,这是我们的这个一上来onre方法就会自动的去调用啊,那调用的时候呢,我们呃可以在这儿呢,我们就呃相当于是人为的去创建一个异常啊。
04:02
来模拟一个异常,这呢,比如我们就造一个string,就是个now哈,说如果这个I tr呢,我们调一个equal库的方法,我们随便写个ABC。然后怎么怎么着,那这呢,你你可以唠一下是吧,那这个就写个ABC吧,那很显然这个呢,在执行处方法的时候呢,这就一个控制针了。来,我们这时候运行一下。好,进来。嗯,他这个直接就给我挂掉了。那这就看具体手机它这个处理的方式了啊。再重新跑一下。
05:05
嗯嗯,啊,他这个。我这个手机模拟的话是跟这个华为有关系了啊,他直接呢,就直接给我挂掉了,没有显示这个框。那这是跟距离的手机小有关系了啊,这正常的话呢,我们这样呢,就是你直接就帮我看看这个框。这个我这个手机看不出来了啊,大家呢,可以用自己的手机或者模拟器来看一下。啊直接呢,就是相当于就报这样一个框。啊,包这个框,那我们再可以做一个处理啊,这呢就显然你这个异常呢,期间没有处理过,那我们要处理一下的话呢,你现在你把它包起来啊out shift z啊。我点一个,那相当于这个异常呢,我们给处理过啊,那处理过的话呢,我们这时候再跑一下看看。
06:03
哎,你看这时候他就没有直接退出了啊。没有直接退出,相当于这时候呢,你这个异常就没有了啊,那其实就这异常我们给处理掉了,所以就你看到跟没有一样。啊,那我们在写这个代码当中的时候呢,总会出现一些你没有处理的异常。啊,因为呢,你要是编译是异常,那我们肯定会拆开始,否则呢,编译也过不了,但有一些异常,想控制人异常非常常见的,我们不可能说代码一上来从头到尾全家才开始,那你代码的冗易就看着就就看着就特别乱了哈,所以对于运行时这些异常呢,我们是很有可能是没有处理过的啊,它就是出现控制帧,这个我们很难发现啊,不可能所有代码都加上这个圈开始了。那既然这样的话呢,我们就肯定会在程序运行过程当中,会出现一些我们没有处理的,或者叫没有补货的这些异常。啊,没有补货的异常,那系统默认的话呢,就这样来报。
07:00
啊,我们刚才看华为这个没看出来是因为他已经呃处理过啊,就是他针对这样的一个方式,自己给他操作处理处理掉了啊正常的话呢,这个就爆出来这样一个问题了,哎,相当于就是你没有去处理这些未补货的异常系统呢,给出来个这样一个框。那我们刚才的第一个需求说希望呢,能够稍微友好一些,那稍微友好一些呢,言外之意呢,就是呃,你出现未补过异常了。你不要让他自动的报,这个我们最好呢,让他按照我们指定的某一个方式去报。是这意思吧,哎,所以这里边呢,我们就要用到了一个类啊,这个类呢,就叫人接说是个接口thread里边有一个叫unco exception handler。啊,比较长啊,翻译过来呢,就是未捕获的异常的处理器啊,就是一旦我们在程序当中出现了一个异常,比如就我们刚才写的啊,我们写的时候呢,就没有写这个try catch,那你相当于这运行的时候就是一个未捕获的异常,你没有try catch过吗?
08:05
啊,那一旦出现这个的时候呢,我们就让他按照我们自己指定的一个方式去报,就不要让他这样报啊,这样的话呢,你就可以写一个比较友好的方式了,既然要想这样做,我们就需要呢,哎,去实现这个接口啊,所以这呢,我们需要提供一个类,哎,我们起名字叫crash handler。好,我们下面就来说一下啊,解决第一个问题就是友好的给用户来一个提示啊,创建一个class。嗯,Crash pandara啊,就出现这样的一个崩溃啊或冲突的时候的一个处理啊,啊implementments这个类呢,是在TH,那这个接口在thad里的啊unco exception,哎,看到了out enter有这样的一个方法需要重写,哎,这个方法的意思呢,就是一旦那系统出现。啊,未捕获的异常啊,就会调用啊如下的回调方法。
09:04
啊是这样一个意思啊好,然后这个呢,是我们实现这个接口了啊呃,这个接口这一个实现类了,然后呢,呃,系统呢,我们说它默认的时候呢,是这样报的,那说明系统呢,它其实有一个默认的。呃,如果出现未捕获的异常的一种处理方式,所以我们这呢,其实也可以试图去获取一下,比如我们这声明一下,呃,就是嗯,我叫什么呀,其实就是他这样的一个声明哈,我我们这样这样写吧,先先写这个方法吧,我这写一个public avoid叫init方法。嗯,这个方法里边呢,我们直接呢,呃,就get一下啊,通过我们这个。嗯,这。来通过这个thad啊,第二我们先盖了一下,这个叫default onco exception under。啊,先获取下它啊,这个有点长了啊,就这样吧,把它呢,我们再给它生命成一个属性这样。
10:05
Shift点爱护啊。那就他啊,这个是谁呢?这个就是系统默认提供的这个啊,或者就声明为就是系统默认的啊,处理未补货啊异常的这个处理器。啊,这我们直接呢,这样的就相当于获取到了,那呢,就是如果出现未捕获异常了,系统报了一个黑框,那个黑框呢,就是他做的事。啊,就他做的事,那我们现在呢,是不是不希望他来做呀,希望我们自己来做啊,那压力就是他自己默认做的时候,是他就调他自己重启的这个方法了,那现在我们希望如果出现微博扩大,就按照这个方式来做。啊,那我们这里边呢,就可以怎么着呢,我们这个sweater。哎,它还有一个呢,叫set一下default onco exception handle,就是重新设置一下。那设置成我们自己这个。
11:01
是这项。对吧,哎,这里我们写上说将啊当前。啊,声名为。啊或叫设置为啊,设置为啊这个出现啊未捕获异常的一个处理器。呃,相当于就不用这个默认的这个方式了。啊,用我们自己的一个方式,那杨I这呢,就是一旦出现未捕获的异常了,就像我们刚才这里边,一旦你这个我们又加他。嗯没嗯,没有写他这个呢,这都注释一下。呃,一旦你出现这个异常是属于未补货的,那我们这呢,就按照我们这个方式在这里边去写这个处理,我就不让你报那个大黑框。啊,就这样啊,那你整个这个操作的话呢,你得调用一下才行啊,就是这个方法你不得用一下才靠谱吗?对,所以这个用的话呢。我们这边又涉及到说你得造这个类的对象去调这个方法啊,所以这里边关于这个CRA handle呢,我们说它也得是一个单例的啊,啊这里边我们关于它的这个说明。
12:10
哎,它也是一个单立的啊行,那它也是个单立,我们想调这个方法,在系统默认的时候去调啊,所以这呢,既然是单立,我们又得是呃写一个单立的模式的啊,单立模式我们写过一个懒汉恶汉式的,这写懒汉式。那写感开式这个就得心里边得想了啊,那你这个是是这万一要是什么呀。线程不安全的是吧。就是万一要是有多个线程来访问怎么办?得同步是吧,在这里边我们说呀,就不用了啊,为什么呢?呃,因为这个异常的这个处理,它就是系统专门的一个线程帮我们做的。啊,就是它本身就是一个专门的线程了啊,所以这个里边呢,就是一个你就理解成是一个单线程的问题了,所以它就不涉及到线程安全问题啊,那既然你不涉及到线程安全问题,在不涉及现全问题的情况下,南汉市跟汉市哪个好,南安市好,为什么呀。
13:13
嗯,哎,对,它是不是延迟去实体化了,哎,对啊对,需要的时候我再造啊,所以这呢,哎只先起个投告器。嗯,然后呢,我们再声明一下。嗯,我这呢先是个闹啊,就是不用一开始就造好,需要的时候再造,这就是非多线程的,就是单线程的情况下啊,蓝还是要更好一些。好在这里边我们直接呢给他判断一下,说如果crash判断呢,是一个no。嗯,Crash handler,就等于你用一个crash handler,嗯,然后在这里边return一下,嗯,Crash handler。
14:05
啊,在这我们表述一下啊,说这个。本身。嗯,本身呢,我们说实例化这个未补过啊异常啊啊处理器,处理器的这个操作就是系统在一个单独的啊线程中完成的。啊,所以呢,不涉及到多线程问题。嗯,然后呢,哎,所以啊使用。那这个懒汉是啊,更好啊,这样。行,这样的话呢,我们就实例化了啊,实例化以后呢,我们希望呢,你改成我们自己的这一个,那你这个代码肯定是要执行的,意味着这个方法是一定要执行的,那我们就可以,哎,在我们说到这个my application。
15:03
啊,因为我们在这个功能清单文件注册的是它了啊,那一上来当前进程,那当前这个程序一加载到进程里,我们在这个on create的方法里边是我就可以做一个修改啊,啊相当于就设置啊未补。啊或异常的一个处理器啊,我们就可以呢,调一下调crash handler.get点做一个in。哎,这样一调用,那哎就这样就做了一个修改了啊,那这个时候整个存在你这个应用的进程当中哈,那一旦出现一个未捕获的异常。就那异常没有处理过,就像我们刚才写的这个一样啊,一旦出现这个问题,我们就会自动的调用这个方法。啊,那在这里边呢,我们可以选择log啊是这亲。啊,出现了啊,未补货的啊,异常了。是吧?那你也可以告诉他这个异常的信息,加上ex.get一个message。
16:05
啊,这样啊。来,我们看看这个能不能执行。好呀。哎,这个时候呢,你看我们这儿啊,我这儿呢,是把它打开的。啊呢,这就这就是一个未捕获的异常。哎,这是这个环节面啊。哎,这时候你看它这就没动静了是吧?哎,你看一下我们这里边这我加上一个T。这么多呀。是不是这样?哎,出现了未补货的异常了,哎,这不就相当于就是调我们这个操作了。
17:05
啊,就按照我们这个套路来执行了哈,行,那这个时候呢,我们还体现不出来,说他还比较友好哈,哎,那我们这时候呢,你可以让他弹一个框啊,或者出一个tos呀,这不就是你自己说了算了嘛,哎,至少现在我们可以走到这一步,就是让他执行我们自定义的这个方式了。啊行,我们先把这个先停一下啊。
我来说两句