Android-出于测试目的强制ANR
为什么我不能用这个代码强制Android? 没有日志消息或弹出窗口。应用程序只是缓慢地启动 [更新] 我甚至睡不着View.setOnClickListener或BroadcastReceiver.onReceive 有把戏吗Android-出于测试目的强制ANR,android,android-anr-dialog,Android,Android Anr Dialog,为什么我不能用这个代码强制Android? 没有日志消息或弹出窗口。应用程序只是缓慢地启动 [更新] 我甚至睡不着View.setOnClickListener或BroadcastReceiver.onReceive 有把戏吗 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
Log.e("Test", "", e);
}
}
}
我正在使用三星GT-6200L和Android 3.2
尝试使用:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int a=0;
while(true) {
a++;
}
}
您的代码可能无法工作,因为它安装得太早,而且活动可能尚未完全初始化和创建。使用上述代码,启动活动并在屏幕上触摸/滑动,等待ANR对话框弹出。在onTouchEvent中尝试。在onCreate中,您的活动未完全运行
在你的活动中做一个按钮
public void onBtn1(View v) {
int a = 0;
while(true) {
a++;
}
}
使按钮执行上述代码。
垃圾邮件用手指点击按钮=)我昨天也遇到了同样的问题,我发现使用简单的调试构建ANR对话框根本不会出现。(尽管UI线程已完全挂起。)
但是在导出并正确签署应用程序后,对话框会正确弹出(在上述所有情况下)。然而,我仍然不确定是什么真正阻止了弹出ANR消息,也许其他人可以稍后澄清这一点…我将此代码用于强制ANR
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void force(View view){
while(true) {}
}
我刚刚在xml文件中创建了一个简单的按钮,并设置android:onClick=force有一个以可靠方式(尽可能可靠)生成ANR的按钮:应用程序由于死锁而挂起
其要点是:
final Object mutex=new Object()代码>
android.os.Handler
根据相同的锁发布工作
new Thread(new Runnable() {
@Override
public void run() {
synchronized (mutex) {
while (true) {
try {
Thread.sleep(60000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
synchronized (mutex) {
// Shouldn't happen
throw new IllegalStateException();
}
}
}, 1000);
例如,将上面的代码片段放入按钮单击处理程序中应该可以做到这一点。如果UI线程中还没有onCreate,请尝试在onStart或onResume@nininhoonCreate不能不在UI线程上Android 4.0中的开发者有一个选项——“显示所有ANR”或类似的东西。也许你在安卓3.2上有这样的选择?它在默认情况下是关闭的,所以普通用户不会受到干扰。非常奇怪。。。我甚至睡不着View.setOnClickListener或BroadcastReceiver.onReceive…@Kzinch我在设置>开发者选项的ICS/JellyBeans中看到了这一点。不幸的是,至少在三星GT-6200中,3.2中没有这个选项……真的吗?我在我的设备上试过了,效果很好。这一定有用。Thread.sleep始终执行,除非被中断(您可以通过logcat消息检查),否则它将保留程序,并且如果程序在3秒内没有响应任何回调,android将抛出ANR。@CelinHC当主线程上没有发生任何其他事件时,您将不会立即看到ANR弹出。你必须等待它,或者你可以按下后退按钮并等待几秒钟来触发它。@Albert JanVerhees这可能是我期待已久的答案。我会测试它。因为Android给了应用很多时间去做工作,如果它没有任何需要响应的东西(直到达到阈值),但是如果需要响应某个东西,而应用没有响应,则会出现ANR。如果你在设备设置的开发者选项中打开此功能,它们会显示出来
new Thread(new Runnable() {
@Override
public void run() {
synchronized (mutex) {
while (true) {
try {
Thread.sleep(60000);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
synchronized (mutex) {
// Shouldn't happen
throw new IllegalStateException();
}
}
}, 1000);