Android:ANR输入调度超时-仅华为设备

时间:2019-07-08 00:55:39

标签: android firebase android-anr-dialog

我将firebase云消息添加到了应用程序。收到数据消息时,我正在当前活动中调用方法。该方法包括排球发布请求。

仅在华为设备中发生ANR。我希望有人可以给我一个主意。谢谢。

ANR堆栈:

Input dispatching timed out (Waiting to send key event because the focused window has not finished processing all of the input events that were previously delivered to it. Outbound queue length: 0. Wait queue length: 2.)

    "main" tid=1 Native 
    "main" prio=5 tid=1 Native
      | group="main" sCount=1 dsCount=0 flags=1 obj=0x73056ad0 self=0x78122a3a00
      | sysTid=20046 nice=-10 cgrp=default sched=0/0 handle=0x78171f79b0
      | state=S schedstat=( 7479347944 793149495 9121 ) utm=657 stm=90 core=2 HZ=100
      | stack=0x7fff6b9000-0x7fff6bb000 stackSize=8MB
      | held mutexes=
      #00  pc 0000000000069800  /system/lib64/libc.so (__epoll_pwait+8)
      #01  pc 000000000001f6c0  /system/lib64/libc.so (epoll_pwait+48)
      #02  pc 0000000000015c80  /system/lib64/libutils.so (_ZN7android6Looper9pollInnerEi+144)
      #03  pc 0000000000015b68  /system/lib64/libutils.so (_ZN7android6Looper8pollOnceEiPiS1_PPv+108)
      #04  pc 000000000011a5dc  /system/lib64/libandroid_runtime.so (???)
      #05  pc 00000000002014ac  /system/framework/arm64/boot-framework.oat (Java_android_os_MessageQueue_nativePollOnce__JI+140)
      at android.os.MessageQueue.nativePollOnce (MessageQueue.java)
      at android.os.MessageQueue.next (MessageQueue.java:379)
      at android.os.Looper.loop (Looper.java:144)
      at android.app.ActivityThread.main (ActivityThread.java:7523)
      at java.lang.reflect.Method.invoke (Method.java)
      at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:245)
      at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:921)

Java代码: dEmptyOperation的类从AsyncTask扩展。 refreshList的方法包括排球发布请求

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
// .. if statement codes
                    new dEmptyOperation() {
                        @Override
                        protected String doInBackground(String... params) {
                            if (main.refreshActivity != null) {
                                try {
                                    main.refreshActivity.refreshList();
                                    main.refresh = false;
                                }catch (Exception ignored){

                                }
                            }
                            return null;
                        }
                    }.execute("");
//..
    }

1 个答案:

答案 0 :(得分:0)

我不知道您的代码就无法确切地说出正在发生什么。但是,我认为您正在当前活动中调用一个在主线程中进行大量工作的方法,这就是大多数情况下使用ANR的原因。

您可以使用AsyncTask轻松避免这种情况。每次处理某些数据时,请创建一个AsyncTask,并在数据处理完毕后处理活动中的回调。

有关如何创建AsyncTask并处理活动中的回调的信息,这里为nice answer

希望有帮助!