您当前的位置:首页 > 文章摘抄 > 正文

安卓的车载机老提示“很抱歉,应用已停止运行”?

修正下,问题看错了,前面回答成 ANR 了,应用已停止运行是执行的代码发生未捕获异常退出了,这种通常会伴随闪退,可以抓下日志看看异常信息即可~~

============下面是 ANR 弹框的解释=================

这类错误一般称为ANR(APP 无响应),原因是 UI 线程被阻塞,要理解这个首先要有线程的概念。

理论上CPU 处理程序都是顺序执行的,100条代码,cpu 会逐条执行,遇到跳转语句则停止当前的处理,然后转去执行跳转目标的代码,执行完后返回接着执行(当然事实上不是,因为有分支预测之类的技术)。如果遇到一些耗时操作,比如等待用户输入之类的,则 cpu 会停下,直到用户完成输入后,cpu 收到数据,才接着执行下去,这种现象称为阻塞。

但有的时候,我们往往需要程序能异步执行代码,即在效果上实现 cpu 能同时执行多个代码块,比如,在等待用户输入的时候,还能放个音乐看个小黄书什么的,为了实现这种异步效果,操作系统为我们引入了进程这个概念。

进程本质上就是一个载入到内存的可执行程序,每当用户启动一个程序,代码就会被载入内存,称为一个进程,用户可以同时启动多个程序,这样就会有多个进程,进程是可以同时被 CPU 执行的,当一个进程的代码发生阻塞,操作系统会让 cpu 自动转去执行另外一个进程。而在一般情况下,操作系统则会按照进程不同的优先级,让 CPU在不同的进程间来回切换执行。

有了进程后人们发现,在很多情况下,光有进程间的异步执行还远远不够,我们往往还需要可执行程序内也有异步执行代码的功能,比如视频播放器程序,我在 cpu 全力从磁盘加载解码渲染视频的时候,显然不能阻塞用户的输入操作比如按停止键,在这种需求下,于是又有了线程这个概念,线程最早被称为次级进程,也就是进程内的进程,后面不知道谁觉得这种说法有点2B,于是改为了线程。

线程出现后,每个可执行程序都会有一个主线程,也就是 main 方法所在的代码流程,然后开发人员可以通过调用系统接口开启新的线程,多个线程在效果上是可以同时执行的,这样,编程的方式就彻底改变了,比如前面提到的视频播放器程序,我可以在程序中开启一个线程负责从磁盘加载解码视屏,然后另开一个线程,负责将解码的视频画到屏幕上,然后再另开一个线程专门接收用户输入,然后这几个线程是同时执行的,这样就解决了上述的问题。

好了,然后我们回过头来看 ANR,每个安卓 APP 中都有一个 UI 线程,专门负责绘制界面,但有的时候,由于一些不良的代码习惯,往往会将一些阻塞性的操作写到 UI 线程上,比如死循环,这样就会导致 UI 线程被阻塞(手机。。。手机它卡住了,点了没反应),安卓系统有个机制就是当 UI 线程被阻塞超过15秒(不同版本不一样,大致这个时间),就会认定这个 APP 挂了,然后系统就会弹出 ANR 弹框告知用户,这破 APP 没响应了,关了吧,就是这么回事。


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 苹果隐藏app怎么移出来?

下一篇: 如何服务社会奉献社会?



推荐阅读