我的应用程序在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会崩溃?任何想法?
答案 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循环中的条件语句中。使用更多有效的语句。
例如队列为空