需要帮助以了解此ANR报告

时间:2018-09-23 21:26:02

标签: android performance android-layout android-anr-dialog

我有一些使用StaticLayout的自定义绘图逻辑。有一些自动调整大小的逻辑可创建StaticLayout的新实例,以便找到要显示的最佳文本大小。但是,我很少看到ANR并试图了解发生这些事件的确切原因。这就是它的意思

    "main" prio=5 tid=1 Runnable
  | group="main" sCount=0 dsCount=0 flags=0 obj=0x738bfc20 self=0x7e282c4a00
  | sysTid=31483 nice=-10 cgrp=default sched=0/0 handle=0x7e2d5109c8
  | state=R schedstat=( 22803957927 398883091 2986 ) utm=2163 stm=117 core=3 HZ=100
  | stack=0x7fff593000-0x7fff595000 stackSize=8MB
  | held mutexes= "mutator lock"(shared held)
  #00  pc 00000000003973ec  /system/lib64/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+212)
  #01  pc 000000000045dba0  /system/lib64/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMapb+348)
  #02  pc 00000000004752bc  /system/lib64/libart.so (_ZN3art14DumpCheckpoint3RunEPNS_6ThreadE+880)
  #03  pc 000000000045e9b0  /system/lib64/libart.so (_ZN3art6Thread21RunCheckpointFunctionEv+416)
  #04  pc 00000000004e20a0  /system/lib64/libart.so (_ZN3art16JniMethodFastEndEjPNS_6ThreadE+92)
  #05  pc 0000000000556360  /system/framework/arm64/boot-framework.oat (Java_android_graphics_Paint_nGetFontMetricsInt__JJLandroid_graphics_Paint_00024FontMetricsInt_2+208)
  at android.graphics.Paint.nGetFontMetricsInt (Paint.java)
  at android.graphics.Paint.getFontMetricsInt (Paint.java:2193)
  at android.text.MeasuredText.addStyleRun (MeasuredText.java:199)
  at android.text.StaticLayout.generate (StaticLayout.java:754)
  at android.text.StaticLayout.<init> (StaticLayout.java:534)
  at android.text.StaticLayout.<init> (StaticLayout.java:479)
  at android.text.StaticLayout.<init> (StaticLayout.java:457)
  at android.text.StaticLayout.<init> (StaticLayout.java:437)

1 个答案:

答案 0 :(得分:0)

重复创建新的布局肯定是UI线程上的昂贵,它会阻塞线程直到工作完成,而不会因为上一次完成新布局的创建而发生。因此,这会导致用户界面阻塞几秒钟,并且由于您正在用户界面上进行大量处理(用户的感觉),Android将您的应用标记为无响应,并向用户显示ANR对话框,允许他/她停止应用并拉出摆脱痛苦。

您应该做的是将您的工作移至后台线程上,并使用new Handler(Looper.getMainLooper())到达UI,如果您的算法如此工作,或者您可以尝试以某种方式更改算法以在没有UI阻塞和用户干预的情况下完成任务注意。