我需要从Activity和BroadCastReceiver重现Application Not Responding(ANR)对话框。 我尝试创建一个简单的按钮点击:
public void makeANRClick(View view){
while (true);
}
使用此代码,我在Android 2.3.7的仿真器上重现了ANR。相同的代码不适用于具有最新Android版本(4 +)的真实设备。
另一种尝试如下:
public void onMakeANRClick(View view){
try {
Thread.sleep(15000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
这也没有帮助。 有什么建议吗?
答案 0 :(得分:1)
看看StrictMode。还有video。
“StrictMode是一个开发人员工具,可以检测您可能偶然发生的事情,并引起您的注意,以便您可以修复它们。”
答案 1 :(得分:1)
您还可以检查转储状态以检查有关您的流程的信息 https://source.android.com/devices/input/diagnostics.html
我重现你的代码,然后拉出'dumpstate_app_anr.txt.gz' 这是结果
PID TID PR CPU%S VSS RSS PCY UID Thread Proc
15287 15287 0 83%R 227152K 25152K fg u0_a135 a.stackoverflow mx.syca.stackoverflow
07-03 08:46:12.454 1618 1636 I ActivityManager:Killing proc 12946:mx.syca.stackoverflow / u0a135:强制停止
获得ANR对话花了大约2分钟
希望有所帮助
答案 2 :(得分:0)
关键字多线程。请阅读此主题http://developer.android.com/training/articles/perf-anr.html 此外,无法在Broadcast Reciever管理UI组件,因为它不是UI组件。 此外,开发选项中还有一个名为“Show All ANR”的选项
答案 3 :(得分:0)
我相信在java(dalvik)中执行ANR的最佳方法是执行荒谬的计算,包括函数调用。
也许类似于:
Integer useless = 0;
for (i=2147483648;i<2147483647;i++){
useless = Math.random() * Math.random() * Math.random() * Math.random();
}
至少会在较弱的系统上触发一些延迟和ANR。