添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

案例:个股详情界面失去焦点后发生ANR,必现。

在发生ANR生启用android stuiod profiler, 调用CPU Sample Java Methods  开启cpu 监测一段时间。

结果如下:

由上图可以看到,main 线程中程序一直在执行

查看主线程方法调用情况

从上面两个图可以看出来, 主线程 markState() 方法执行占用CPU高达99.60%,耗时长,则表示一定是此处造成的ANR。

从调用顺序可以看出,是由于StockDataInfoActivity.onStop()方法执行后造成的,这与造成的ANR现象一致,是个股详情界面失去焦点时发生ANR.

markState()方法是Fragment的源码,启动debug模式, 最终发现是该方法循环递归造成的。

原因:项目tragetSdkVersion为28, fragmnet的V4包是28.0.0,在个股详情界面SherlockFragmentActivity 所加载的StockDataInfoFragment所继承的LazyLoadFragment中,在onStop onResume onPasue等生命周期方法中调用了getLifecycler().handleLifecyclerEvent()方法。

@Override
public void onStop() {
    super.onStop();
    handleLifecycleEvent(Lifecycle.Event.ON_STOP);
.......
private void handleLifecycleEvent(Lifecycle.Event event) {
    if (mLifecycleRegistry != null) {
        mLifecycleRegistry.handleLifecycleEvent(event);

在26.0.0版本及之前的V4包中的fragment 没有getLifecycle()方法,如果需要使用LifecycleRegistery,则需要自己重写生命周期方法并发送相应的事件;而在26.0.1及以后,源码已经处理了,此时如果在业务代码中,再去发送这些事件,就会导致V4 fragment源码中处理生命周期事件时发生递归,造成死循环。

解决方法:删除 mLifecycleRegistry.handleLifecycleEvent(event) 相关代码即可。

希望对大家有用!!!

案例:个股详情界面失去焦点后发生ANR,必现。在发生ANR生启用android stuiod profiler, 调用CPUSample Java Methods 开启cpu监测一段时间。结果如下:由上图可以看到,main线程中程序一直在执行查看主线程方法调用情况从上面两个图可以看出来,主线程 markState()方法执行占用CPU高达99.60%,耗时长,则表示一定是此处造成的ANR。从调用顺序可以看出,是由于StockD...
Android开发中,当程序发生异常时会抛出异常信息,可以通过如下代码来获取异常信息,然而在ANR时我们在Logcat中并看不到异常信息。 Thread.setDefaultUncaughtExceptionHandler(new Thread. UncaughtExceptionHandler() { public void uncaughtException(Thread t, Thr
Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。 以下四个条件都可以造成ANR发生: InputDispatching Timeout:5...
ANR(Application Not Responding ) 应用无响应的简称,是为了在 app 卡死时,用户 可以强制退出APP的选择,从而避免卡机无响应问题,这是Android 系统的一种自我保护机制。 什么是ANR ANR的类型 ANR 产生的原因 如何分析解决 ANR问题 ANR 问题分析解决建议 MTK 平台 ANR问题分析 欢迎关注微信公众号:程序员Androi...
一、ANR的定义 Android全称是Application Not Response,即程序无响应。ANR的直观体验是用户在操作APP的过程中,感觉界面卡顿,如果 Android应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR) 错误,如下图所示,ANR 对话框会为用户提供强行退出应用的选项。 当点击了Close app或者由于ANR引起了闪退之后,这时查看Logcat,一般...
大部分做安卓的小伙伴相信对于ANR一定不陌生,相比于发生应用程序崩溃,发生ANR更加让人头大,主要原因是崩溃发生的时候会在Logcat中打印出发生异常的位置,开发人员很容易就能定位到崩溃并解决,显然ANR没那么轻松;但是我们大可不必这么忧伤,因为绝大部分ANR都是很容易解决的,只是我们没找到方法而已; 首先要搞定ANR就要对他有一个根本性的认识,和我们了解任何事物一样,只有抓住了事物之根本,才能在...
使用匿名类注册监听器public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentV
做过Android的同学必定都有遇到过ANR(Application Not Response)问题,一般的做法是去查看traces.txt日志文件。今天刚好有碰到了,就记录下,方便以后查看。 把traces.txt文件复制到电脑上 使用adb pull data/anr/traces.txt命令。 (一)首先,需要在系统变量path添加adb.exe所在的文件目录: (二)接着,就可以打开c...
一、知识储备 1.ANR错误定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作“应用程序无响应”(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。 默认情况下,在Android中Activi.
ANR (Application Not Responding) 是 Android 系统中的一种错误,当应用程序在主线程上进行耗时操作而无法响应用户输入时,系统会弹出 ANR 对话框,提示用户等待或强制关闭应用程序。Binder 是 Android 系统中的一种进程间通信机制,它负责在不同的进程之间传递数据和消息。 在 Android 应用程序中,如果应用程序在主线程上进行了耗时操作而无法响应用户输入,系统会认为应用程序已经崩溃并弹出 ANR 对话框。如果应用程序涉及到跨进程通信,例如使用 Binder 机制与其他进程进行通信,那么如果 Binder 通信超时或者出现死锁,也可能会导致 ANR 错误的发生。因此,在 Android 应用程序中,需要注意避免在主线程上进行耗时操作,以及合理使用进程间通信机制,避免出现 ANR 错误。