Android ANR - 输入调度超时

Posted

技术标签:

【中文标题】Android ANR - 输入调度超时【英文标题】:Android ANR - Input dispatching timed out 【发布时间】:2018-01-29 13:48:18 【问题描述】:

我已经开始从许多代码位置收到几个奇怪的 ANR 报告(应用程序无响应)。

输入调度超时(等待,因为没有窗口有焦点,但 有一个焦点应用程序最终可能会添加一个窗口 它完成启动。)

此 ANR 总是在我的代码中的不同位置弹出,并且它们不遵循逻辑模式。大约一个月前,我开始收到这些错误。

有一些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 版本的这些错误:

摩托罗拉 Moto G(第二代)(titan_umtsds),1024MB RAM,Android 6.0 三星 Galaxy Win2 (coreprimeltedtv),1024MB RAM,Android 5.0 摩托罗拉 Moto G(第一代)(falcon_umts),2048MB RAM,Android 7.1

很遗憾,Google Play 管理中心没有提供更多信息。

【问题讨论】:

我的第一个想法是您是否在 UI 线程上完成所有工作(线程过载),而不是为密集任务启动新线程?使用 AsyncTask 类在另一个线程上完成所有艰苦的工作。也许你的设备在其他事情上工作太辛苦了? 在我的第一个示例中,setContentView(); 中出现错误,onCreateView() 中的第一行如何。根据错误描述,我的第一个猜测也是主线程超载,但 Android Monitor 没有指出任何关键 是的 setContentView() 很快(但不是第一个调用的方法)。我的“也许你的设备在其他事情上工作太辛苦”的意思是,其他服务例如,用完资源,但你使用的是“Android Monitor”,所以你应该看到(在 logcat 的另一个选项卡中)。你说“.same error but in different places and different applications”这似乎肯定是电话资源问题 cpu ?内存、空间、交换问题] 买一部更好的手机 ;O) .puzzling. 我从许多设备和 Android 版本的 Play 商店控制台收到此错误。将更新我的问题。 我更新了我的问题,但不孕症 Google Play 控制台没有提供更多信息。 【参考方案1】:

您的问题发生在 Handler 中,这意味着它发生在主线程上。您应该在 IO 线程上调用所有计费处理器方法以避免阻塞您的主线程。

实际上有太多可能的方法来做到这一点,以简明扼要地描述。 AsyncTasks、RxJava、vanilla Threads、Android Service 等。

【讨论】:

以上是关于Android ANR - 输入调度超时的主要内容,如果未能解决你的问题,请参考以下文章

Android 4.4 上的 ANR 输入调度超时

com.android.inputmethod.latin 中的 ANR 原因:输入调度超时

输入调度超时 ANR

ANR 输入调度超时

输入调度超时导致的 ANR - 在尝试获取我的公共 IP 地址时

ANR 输入超时