Нужна помощь в понимании этого отчета ANR - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть некоторая пользовательская логика рисования, которая использует 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 голосов
/ 24 сентября 2018

Повторное создание новых макетов - это, безусловно, что-то дорогое в потоке пользовательского интерфейса, которое блокирует поток до тех пор, пока работа не будет выполнена, что не происходит из-за создания нового макета, как только предыдущий будет выполнен.Таким образом, это приводит к блокировке пользовательского интерфейса на несколько секунд, и Android помечает ваше приложение как не реагирующее из-за тяжелой обработки, которую вы выполняете в пользовательском интерфейсе (что чувствует пользователь), и показывает пользователю диалоговое окно ANR, позволяющее ему / ей остановить приложение и потянутьвернитесь назад к страданиям.

Что вам нужно сделать, это переместить свою работу в фоновый поток и достичь пользовательского интерфейса с new Handler(Looper.getMainLooper()), если ваш алгоритм работает так или вы можете попытаться изменить свой алгоритм, чтобы получитьэто делается без блокировки пользовательского интерфейса и уведомления пользователей.

...