Android ANR - 输入调度超时

17

我开始收到许多代码位置的奇怪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版本收到这些错误:

  • Motorola Moto G(第二代)(titan_umtsds),1024MB RAM,Android 6.0
  • Samsung Galaxy Win2(coreprimeltedtv),1024MB RAM,Android 5.0
  • Motorola Moto G(第一代)(falcon_umts),2048MB RAM,Android 7.1

不幸的是,Google Play控制台没有提供更多信息。


2
我的第一反应是你是否在UI线程上做了所有的工作(线程过载),而没有为密集任务启动新线程?使用AsyncTask类在另一个线程上完成所有繁重的工作。也许你的设备正在忙于其他事情? - Jon Goodwin
在我的第一个示例中,错误发生在setContentView();,这是onCreateView()中的第一行之一。根据错误的描述,主线程超载也是我的第一个猜测,但Android Monitor没有指出任何关键问题。 - GuilhermeFGL
是的,setContentView()方法很快(但不是第一个被调用的方法)。我的“也许你的设备正在忙于其他事情”意味着,例如其他服务正在使用资源,但你正在使用“Android Monitor”,所以你应该在另一个选项卡中看到它(从logcat中)。你说“相同的错误但在不同的位置和不同的应用程序”,这似乎肯定是手机资源问题{cpu?内存、空间、交换问题],买一部更好的手机吧;O) }。令人困惑。 - Jon Goodwin
我从Play Store控制台收到了这些错误,来自许多设备和Android版本。我会更新我的问题并附上它们。 - GuilhermeFGL
同样的问题在这里。 - Denny
显示剩余2条评论
1个回答

3

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

有太多可能的方法可以简洁地描述这个问题。AsyncTasks、RxJava、vanilla Threads、Android Service等等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接