我有一些使用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)
答案 0 :(得分:0)
重复创建新的布局肯定是UI线程上的昂贵,它会阻塞线程直到工作完成,而不会因为上一次完成新布局的创建而发生。因此,这会导致用户界面阻塞几秒钟,并且由于您正在用户界面上进行大量处理(用户的感觉),Android将您的应用标记为无响应,并向用户显示ANR对话框,允许他/她停止应用并拉出摆脱痛苦。
您应该做的是将您的工作移至后台线程上,并使用new Handler(Looper.getMainLooper())
到达UI,如果您的算法如此工作,或者您可以尝试以某种方式更改算法以在没有UI阻塞和用户干预的情况下完成任务注意。