9

为什么我不能使用此代码强制 Android ANR ?没有日志消息或弹出。该应用程序只是延迟启动。

[更新]

我什至连 View.setOnClickListener 或 BroadcastReceiver.onReceive 都睡不着!

有诀窍吗?

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);
        }
    }
}

我正在使用带有库存 Android 3.2 的三星 GT-6200L

4

6 回答 6

10

在 onTouchEvent 中尝试一下。在 onCreate 你的活动没有完全运行

@Override
public boolean onTouchEvent(MotionEvent event) {
    Log.d(TAG,"onTouchEvent");  
    while(true) {}
}
于 2012-10-23T16:58:39.087 回答
3

我昨天遇到了同样的问题,我发现使用简单的调试构建 ANR 对话框根本不会出现。(虽然 UI 线程完全挂起。)

但在导出并正确签署应用程序后,对话框正确弹出(在上述每种情况下)。但是我仍然不确定是什么真正阻止了弹出 ANR 消息,也许其他人可以稍后澄清这一点......

于 2013-06-14T10:48:00.803 回答
2

尝试使用:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    int a=0;
    while(true) {
        a++;
    }       
}

您的代码可能无法正常工作,因为它设置得太早了,并且 Activity 可能还没有完全初始化和创建。使用上面的代码,启动活动并在屏幕上触摸/滑动,然后等待 ANR 对话框弹出。

于 2012-10-23T16:23:29.037 回答
2

ANR-WatchDog 项目有一个测试应用程序,它以可靠的方式生成 ANR(与 ANR 一样可靠):应用程序由于死锁而挂起。

它的要点:

  1. 在您的活动中准备一个锁定对象作为私有字段: final Object mutex = new Object();

  2. 有一个线程在关键部分执行一些工作,并且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);
    

例如,将上面的代码片段放在按钮单击处理程序中应该可以解决问题。

于 2017-08-09T09:55:54.570 回答
1

在您的活动中制作一个按钮。

public void onBtn1(View v) {
   int a = 0;
   while(true) {
      a++;
   }
}

让按钮执行上面的代码。垃圾邮件用手指点击按钮 =)

于 2012-10-23T16:59:37.817 回答
0

我将此代码用于强制 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

于 2014-01-10T08:02:51.453 回答