ANR 输入调度超时

Posted

技术标签:

【中文标题】ANR 输入调度超时【英文标题】:ANR Input dispatching timed out 【发布时间】:2016-12-30 12:01:26 【问题描述】:

(等待发送非键事件,因为触摸窗口尚未完成对 500.0 多毫秒前传递给它的某些输入事件的处理。等待队列长度:60。等待队列头年龄:8503.2ms。)

嗨!我从几个用户那里收到了这个奇怪的 ANR 报告。不幸的是,我对 ANR 报告的了解非常有限,我希望有人可以帮助我了解造成这种情况的原因

"main" prio=5 tid=1 Suspended
| group="main" sCount=1 dsCount=0 obj=0x74a20f90 self=0x557fe6f9d0
| sysTid=23849 nice=1 cgrp=top_visible sched=0/0 handle=0x7faf4f5000
| state=S schedstat=( 79111961552 2206905376 39235 ) utm=7534 stm=377 core=7 HZ=100
| stack=0x7fdaaf0000-0x7fdaaf2000 stackSize=8MB
| held mutexes=
at android.os.MessageQueue.removeMessages(MessageQueue.java:682)
- locked <0x08f02647> (a android.os.MessageQueue)
at android.os.Handler.removeMessages(Handler.java:652)
at android.view.Choreographer.removeCallbacksInternal(Choreographer.java:418)
- locked <0x0bd41e74> (a java.lang.Object)
at android.view.Choreographer.removeCallbacks(Choreographer.java:406)
at android.view.View.removeCallbacks(View.java:13179)
at android.support.v4.widget.aa.a(unavailable:-1)
at android.support.v4.widget.DrawerLayout.a(unavailable:-1)
at android.support.v4.widget.DrawerLayout.onInterceptTouchEvent(unavailable:-1)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2108)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2525)
at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2254)
at com.android.internal.policy.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2461)
at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1777)
at android.app.Activity.dispatchTouchEvent(Activity.java:2865)
at android.support.v7.view.n.dispatchTouchEvent(unavailable:-1)
at android.support.v7.view.n.dispatchTouchEvent(unavailable:-1)
at com.android.internal.policy.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2422)
at android.view.View.dispatchPointerEvent(View.java:9610)
at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4436)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4302)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3836)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3889)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3855)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3981)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3863)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:4038)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3836)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3889)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3855)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3863)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3836)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6135)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6109)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6070)
at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6251)
at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:192)
at android.os.MessageQueue.nativePollOnce(Native method)
at android.os.MessageQueue.next(MessageQueue.java:330)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5546)
at java.lang.reflect.Method.invoke!(Native method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

【问题讨论】:

ANR 活动没有响应。可能你在主线程中做了太多的工作 问题是我在主线程上没有做太多工作(据我所知) - 尽管我正在使用带有谷歌地图 mapfragment 的 viewpager - 可能是 mapfragment 正在加载很多自定义图块虽然不可见? 获得 ANR 时地图片段是否可见?如果没有,您可以尝试告诉 viewpager 它应该缓存多少页面,或者加载一个空片段以检查问题是否是 mapfragment 您好,我在拥有 ExoPlayer 列表时遇到了同样的问题,此 ANR 仅在 MotoG4 设备上生成。在所有其他设备中,它完美地工作。错误:原因:输入调度超时(等待发送非键事件,因为触摸窗口尚未完成对 500.0 毫秒前交付给它的某些输入事件的处理。等待队列长度: 8. 等待队列头时间:5766.3ms。) 【参考方案1】:

当我有一个循环并且有一个循环增加的条件时,这发生在我身上。当条件不满足时,我没有设置增量。因此,循环停止了。这导致了上述错误。

没有您的代码,我无能为力。但以上是您的错误的可能原因。

【讨论】:

【参考方案2】:

显然,您的日志不完整。它只显示主线程日志,还有什么 线程日志。

在主线程中,从这个"main" prio=5 tid=1 Suspended,我们知道线程被挂起。在此之前,它 - locked &lt;0x08f02647&gt; (a android.os.MessageQueue) at android.os.Handler.removeMessages(Handler.java:652) at android.view.Choreographer.removeCallbacksInternal(Choreographer.java:418) - locked &lt;0x0bd41e74&gt; (a java.lang.Object)

你应该搜索日志,看看哪个线程等待锁定和,你可能会找到一些线索。

【讨论】:

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

ANR 输入调度超时

Android:ANR 输入调度超时

Android 4.4 上的 ANR 输入调度超时

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

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

ANR 输入超时