Closed aishang5wpj closed 7 years ago
理解的很对。Cockroach并不知道该如何恢复逻辑,只是相当于加了一个大大的try catch。
有时app抛出的异常可以不导致app crash,网上有人举例说就跟人生病一样,不能视而不见,而是要正视问题,但他忽略了一个问题,虽然都是病,但有的严重有的不严重,对于一些不严重的病却执意要治疗的话可能得不偿失。这个库也是这么个道理,有的异常忽视掉可能是最好的选择,比本想如点击图片开启新页面时,onclick方法中却出现了异常,如果不处理,只能导致crash,但用了Cockroach后就跟没点击一样,没有其他影响。详细很多大公司的app中都有这种逻辑,蘑菇街中就有这种拦截点击异常的方案,只不过是通过反射替换掉了相关的handler来实现的。
关于疑惑: 当然不是同时在跑,新的死循环会导致ActivityThread的循环不再循环,也不会退出,由于都是在一个线程中所以新的循环不会漏掉待处理的消息,也不存在多线程问题,可以参考 原理分析.md
明白了,装载之前,程序流程是阻塞在main()中的for循环里,后来for循环取到我们的runnable之后,程序的流程就阻塞在了我们的runnable里面了。 原来是loop()的for(;;)死循环阻塞,现在是我们的while(true)里面的for(;;)阻塞。 理解的更加透彻了。
👍
分析的很通俗易懂,谢谢分享。另外,谷歌为什么直接在ActivityThread的Looper.loop();外面套一个try/catch,然后由用户的回调函数来决定如何处理,是选择crash还是打堆栈提示开发人员,这样无论对终端用户还是开发人员,体验都会很好。
谷歌对异常0容忍,既然已经有问题了,结束进程也很合理,若任由用户处理的话可能会带来更多的问题。即使真的加了try catch也只能保证java异常不会导致进程重启,但逻辑已经乱了,抛出异常后方法直接层层退出,导致执行不完整,可能就会导致一系列问题,比如黑屏等。谷歌已经对Android的异常做了善后处理,即重启进程,并重新创建上一个Activity,让用户感觉不到进程已经重启了。这个库也只能在确定没有其他影响的情况下才可以装载,不建议全局装载
恩,直接退出app这样能够引起开发者的足够重视
这你都能先到,老夫佩服佩服
是个有想法的好青年!
@BryanSharp 招人吗?是大厂吗?能带我飞吗?→_→
其实这个库并不能帮你解决程序中的逻辑错误,它只是当你出现异常的时候让你的app进程不会崩,可以减少crash的次数,增加用户体验和留存率而已。 但是异常发生时,异常后面的代码都不会被执行到,程序的逻辑会到异常处为止,接下来的逻辑是程序把异常一层一层往上抛,如果抛到最后还没有被处理掉,那么app就会crash。 这个框架就是在异常被抛到最上层的时候把它处理掉了,仅此而已。
不过有个新的疑惑,Cockroach在安装时,手动调用了Looper.loop(),那ActivityThread的main方法中调用的那个Looper.loop()还会被执行吗?loop()方法中是一个死循环,那这样会有两个死循环同时在跑吗?