web-dev-qa-db-fra.com

Android ANR - Dépassement de la temporisation d'entrée

J'ai commencé à recevoir plusieurs rapports ANR étranges (application non répondante) à partir de nombreux emplacements de code.

La répartition des entrées a expiré (en attente car aucune fenêtre n'a le focus, mais Une application ciblée peut éventuellement ajouter une fenêtre lorsque Son démarrage est terminé.)

Cet ANR apparaît toujours à différents endroits de mon code et ne suit aucun schéma logique. J'ai commencé à recevoir ces erreurs il y a environ un mois.

Il y a quelques exemples de rapports ANR et sa ligne de code respective:

at Android.support.v7.app.AppCompatActivity.setContentView (AppCompatActivity.Java:139)
at br.com.xxx.xxx.activities.MainActivity.onCreate (MainActivity.Java:71)
at Android.app.Activity.performCreate (Activity.Java:6245)

MainActivity.Java:71: setContentView(R.layout.activity_main);

Un autre exemple:

at Android.support.v4.app.BackStackRecord.replace (BackStackRecord.Java:421)
at br.com.xxx.xxx.activities.MainActivity.openFragment (MainActivity.Java:146)
at br.com.xxx.xxx.activities.MainActivity.openMenu (MainActivity.Java:121)

                       currentFragment = new CardsFragment();
MainActivity.Java:146: openFragment(currentFragment);

Et celui-là n'a même pas de référence dans le code:

  at Java.lang.Object.wait! (Native method)
- waiting on <0x0a7b02dc> (a Java.lang.Object)
  at Java.lang.Thread.parkFor$ (Thread.Java:1220)
- locked <0x0a7b02dc> (a Java.lang.Object)
  at Sun.misc.Unsafe.park (Unsafe.Java:299)
  at Java.util.concurrent.locks.LockSupport.park (LockSupport.Java:158)
  at Java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt (AbstractQueuedSynchronizer.Java:810)
  at Java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly (AbstractQueuedSynchronizer.Java:971)
  at Java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly (AbstractQueuedSynchronizer.Java:1278)
  at Java.util.concurrent.CountDownLatch.await (CountDownLatch.Java:203)
  at Android.app.SharedPreferencesImpl$EditorImpl$1.run (SharedPreferencesImpl.Java:366)
  at Android.app.QueuedWork.waitToFinish (QueuedWork.Java:88)
  at Android.app.ActivityThread.handleStopService (ActivityThread.Java:3065)
  at Android.app.ActivityThread.-wrap21 (ActivityThread.Java)
  at Android.app.ActivityThread$H.handleMessage (ActivityThread.Java:1457)
  at Android.os.Handler.dispatchMessage (Handler.Java:102)
  at Android.os.Looper.loop (Looper.Java:148)
  at Android.app.ActivityThread.main (ActivityThread.Java:5443)
  at Java.lang.reflect.Method.invoke! (Native method)
  at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.Java:728)
  at com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:618)

Ma question est la suivante: il y a beaucoup d'ANR qui signalent la même erreur, mais à des endroits et des applications différentes. Comment résoudre cette erreur? Ou je dois considérer toutes ces erreurs comme différentes erreurs isolées?

Je sais qu'il y a déjà des questions sur ce thème, mais personne n'a encore donné de réponse utile. Au moins aucun qui pourrait m'aider.

Edit: Je reçois ces erreurs de nombreux appareils et versions Android:

  • Motorola Moto G (2e génération) (titan_umtsds), 1024 Mo de RAM, Android 6.0
  • Samsung Galaxy Win2 (coreprimeltedtv), 1024 Mo de RAM, Android 5.0
  • Motorola Moto G (1re génération) (falcon_umts), 2048 Mo de RAM, Android 7.1

Malheureusement, la console Google Play ne fournit pas beaucoup plus d'informations.

14
GuilhermeFGL

Votre problème se produit dans Handler, ce qui signifie qu'il se produit dans le thread principal. Vous devez appeler toutes les méthodes du processeur de facturation sur un thread IO pour éviter de bloquer votre thread principal.

Il y a littéralement trop de façons possibles de le faire pour décrire succinctement. AsyncTasks, RxJava, Threads Vanilla, Service Android, etc.

1
hossam scott