友盟统计ANR

今天在测试app的时候,发现有一个地方一直在报ANR,没有定位到具体代码。

通过网上资料写了一个方法,去监听代码里面超时的地方,抛出异常进行定位。

具体如下:

public class ANRWatchDog extends Thread {
    public static final int MESSAGE_WATCHDOG_TIME_TICK = 0;
    /**
     * 判定Activity发生了ANR的时间,必须要小于5秒,否则等弹出ANR,可能就被用户立即杀死了。
     */
    public static final int ACTIVITY_ANR_TIMEOUT = 2000;
    private static int lastTimeTick = -1;
    private static int timeTick = 0;
    private Handler watchDogHandler = new android.os.Handler() {
        @Override
        public void handleMessage(Message msg) {
            timeTick++;
            timeTick = timeTick % Integer.MAX_VALUE;
        }
    };

    @Override
    public void run() {
        while (true) {
            watchDogHandler.sendEmptyMessage(MESSAGE_WATCHDOG_TIME_TICK);
            try {
                Thread.sleep(ACTIVITY_ANR_TIMEOUT);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //如果相等,说明过了ACTIVITY_ANR_TIMEOUT的时间后watchDogHandler仍没有处理消息,已经ANR了
            if (timeTick == lastTimeTick) {
                throw new ANRException();
            } else {
                lastTimeTick = timeTick;
            }
        }
    }
    public class ANRException extends RuntimeException {
        public ANRException() {
            super("应用程序无响应,快来改BUG啊!!");
            Thread mainThread = Looper.getMainLooper().getThread();
            setStackTrace(mainThread.getStackTrace());
        }
    }

}

然后在的Application中将该类初始化。

系统内存在超时的地方,就会抛出异常,并帮你定位。

我的情况是在使用友盟统计的时候,在Activity中调用onKillProcess这个方法。

onKillProcess是在app内杀死进程的时候(如 Process.kil,System.exit)进行调用的方法,主要是保存一些页面调用的数据。正常的应用是不需要调用此方法的。因为保存的时候耗时太长,所以ANR了。

所以在使用onKillProcess的时候切忌,使用在正确的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值