web-dev-qa-db-ja.com

Android ANR-入力ディスパッチがタイムアウトしました

多くのコードの場所から、いくつかの奇妙なANRレポート(アプリケーションが応答していません)を受け取り始めました。

入力ディスパッチがタイムアウトしました(フォーカスのあるウィンドウがないため待機していますが、起動が完了すると最終的にウィンドウを追加する可能性のあるフォーカスされたアプリケーションがあります。)

このANRは、コード内のさまざまな場所に常に表示され、論理的なパターンには従いません。私は約1か月前にそれらのエラーを受け取り始めました。

ANRレポートと彼のそれぞれのコード行の例がいくつかあります。

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);

もう一つの例:

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);

そして、それはコードへの参照さえ持っていません:

  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)

私の質問は:同じエラーを報告するANRがたくさんありますが、場所やアプリケーションが異なります。このエラーを解決するにはどうすればよいですか?または、これらすべてのエラーを異なる分離エラーと見なす必要がありますか?

このテーマについてはすでに質問があることは知っていますが、まだ誰も役立つ回答をしていません。少なくとも私を助けることができるものはありません。

編集:多くのデバイスからこれらのエラーを受け取り、Androidバージョン:

  • Motorola Moto G(第2世代)(titan_umtsds)、1024MB RAM、Android 6.0
  • Samsung Galaxy Win2(coreprimeltedtv)、1024MB RAM、Android 5.0
  • Motorola Moto G(第1世代)(falcon_umts)、2048MB RAM、Android 7.1

残念ながら、GooglePlayコンソールはそれ以上の情報を提供していません。

15
GuilhermeFGL

問題はハンドラーで発生しています。つまり、メインスレッドで発生しています。メインスレッドのブロックを回避するために、IOスレッドですべての課金プロセッサメソッドを呼び出す必要があります。

簡潔に説明するには、文字通りこれを行う方法が多すぎます。 AsyncTasks、RxJava、Vanilla Threads、Androidサービスなど。

1
hossam scott