Android Lollipop应用程序无响应

时间:2015-02-19 09:35:07

标签: android android-asynctask wait android-5.0-lollipop android-anr-dialog

我的应用程序在Android 4.4 - 2.3上正常运行。但我最近将我的Nexus 7更新为Android 5.0.2(Lollipop),只有在这里我才得到错误/ ANR。但我不知道为什么。我无法在此处或在网络上找到任何相关内容。

当我开始AsyncTask时,会出现ANR。它首先运行良好,5秒后,UI线程冻结,我得到很多ART运行时错误。 下面我列出了一些不断重复的ErrorLines:

02-19 10:12:23.060: A/art(7229): art/runtime/thread_list.cc:170] Thread suspend timeout
02-19 10:12:23.060: A/art(7229): art/runtime/thread_list.cc:170] DALVIK THREADS (27): 
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170] "ReferenceQueueDaemon" daemon prio=5 tid=7 Waiting
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   | group="system" sCount=1 dsCount=0 obj=0x12c26080 self=0xac59c000
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   | sysTid=7240 nice=0 cgrp=apps sched=0/0 handle=0xac598380
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   | state=S schedstat=( 0 0 0 ) utm=0 stm=2 core=3 HZ=100
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   | stack=0xb421f000-0xb4221000 stackSize=1036KB
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   | held mutexes=
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   at java.lang.Object.wait!(Native method)
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   - waiting on <0x063dedd6> (a java.lang.Class<java.lang.ref.ReferenceQueue>)
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:133)
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   - locked <0x063dedd6> (a java.lang.Class<java.lang.ref.ReferenceQueue>)
02-19 10:12:23.061: A/art(7229): art/runtime/thread_list.cc:170]   at java.lang.Thread.run(Thread.java:818)

相同版本的应用程序在所有其他API上运行正常。 Lollipop会以不同的方式处理多任务处理和wait()通话吗?

我希望你们中的任何人都能提供帮助,也许会有类似的问题。

谢谢!

编辑1: 结构:

1:单击UpdateButton启动AsyncTask,它将更新请求发送到蓝牙设备并等待任何收到的消息

2:Incomming消息存储在MessageQueue中  (如果此队列为空,则调用wait())

try {
    synchronized (myMessages) {
         myMessages.wait();
    }
} catch (InterruptedException ex) {
    return null;
}

3:如果myMessages不为空 - >它会向更新Intent

BroadcastReceiver发送更新ListView

重复此操作,直到用户再次单击UpdateButton。 它工作约5秒钟,然后冻结。 AsyncTask本身没有UI处理。

编辑2:

调试时我得到了这个非常奇怪的行为:D。我将如上所述AsyncTask:它的doInBackground方法如下所示:

@Override
protected String doInBackground(Void... params) {
     while(buttonClicked){
          // #POS: HERE IS THE STRANGE BEHAVIOR HAPPENING
          if(checkAnCondition){
                 doWork();
          }
     }
}

如果我在while循环中运行AsyncTask并且#POS没有任何内容,则会抛出Application not Responding。在调试过程中,我在这个#POS上添加了一个System.out.println(&#34;&#34;)语句然后..应用程序正常运行:D WTF? :d

那么..如果while语句中的第一件事是if条件,为什么app会崩溃?任何想法?

2 个答案:

答案 0 :(得分:1)

问题是你正在冻结一个线程,它不是主线程所以你在ARN之前有更多的“差距”,但是在5秒之后...... Android会抛出错误。

您可以尝试避免永远阻止线程检查队列的每3秒(在等待句中使用超时),例如:

try {
    while( i have no messages){
        synchronized (myMessages) {
             myMessages.wait(300);
         }
    }
} catch (InterruptedException ex) {
return null;
}

我无法重现您的错误,所以...如果有帮助,请告诉我。

修改

我更改了while和timeout条件。

答案 1 :(得分:0)

问题在while循环中的条件语句中。使用更多有效的语句。

例如队列为空