android应用检测anr的方法

android not response
anr 看到一些博客说android产生anr,ui线程阻塞5秒,广播阻塞10秒,service阻塞20秒都会产生anr异常。
而且anr异常会由系统捕捉,保存到trace.txt文件中,好像是data/anr/trace.txt.具体哪里我也不知道。在程序中捕捉异常
可以用android的异常类UncaughtExceptionHandler,在base类中使用。检测不到anr异常。
但是如果在程序中检测anr异常怎么检测呢?
看到网上有人提出的思路,开启线程给ui线程发送一个计数器,并且让计数器+1,保存上一次计数器。线程休眠5秒。如果两次计数器
的值不想等,则没有阻塞。如果相等主线程阻塞。
但是,为了检测界面,不能每一个activity,或者fragment都开启一个访问ui的线程吧。
后来,了解到service也同属于ui线程。
可以开启service后台服务,然后访问ui线程,采用上面的方法来探测anr产生。
如果产生anr,想读取anr文件,手机需要root的。但是至少可以检测出,用户在使用的时候发生了anr。但是至于在何处产生anr。
还有待考究。

但是,这种方法有一个弊端,就是如果你程序还没启动service,anr就已经发生了,那就检测不出来了。必须在发生anr前去
开启service。
下面是代码:

public class ANRService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.e("gac","ANRService");
        exception();
    }
    private int lasttick,mTick;//两次计数器的值
    private Handler mHandler = new Handler();
    private boolean flag = true;
    private void exception(){

        new Thread(new Runnable() {
            @Override
            public void run() {
                while(flag){
                    lasttick = mTick;
                    mHandler.post(tickerRunnable);//向主线程发送消息 计数器值+1
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(mTick == lasttick){
                        flag = false;
                        Log.e("gac","anr happned in here");
                        handleAnrError();
                    }
                }
            }
        }).start();
    }

    //发生anr的时候,在此处写逻辑
    private void handleAnrError(){

    }
    private final Runnable tickerRunnable = new Runnable() {
        @Override public void run() {
            mTick = (mTick + 1) % 10;
        }
    };
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ANR(Application Not Responding)指的是Android应用在主线程上执行耗时操作时出现的无响应现象,这可能导致应用无法响应用户输入,给用户带来不良体验。下面是几种常见的解决ANR问题的方法: 1. 将耗时操作放在子线程中:将耗时的操作(如网络请求、数据库查询等)放在子线程中执行,避免阻塞主线程。可以使用Thread、AsyncTask、Handler等方式创建子线程,确保主线程保持响应。 2. 使用异步操作:对于一些需要等待结果的操作,例如网络请求或数据库查询,使用异步方式执行,如使用AsyncTask、Handler、RxJava等框架来处理。 3. 使用多线程技术:合理使用多线程技术,将一些繁重的计算或IO操作放在后台线程中执行,以减轻主线程的负担。 4. 避免在主线程进行耗时的IO操作:例如文件读写、数据库操作等,这些操作可以使用异步方式或将其放在子线程中执行。 5. 使用合适的数据结构和算法:优化代码逻辑,使用高效的数据结构和算法,减少不必要的计算和迭代。 6. 避免频繁的UI更新:减少UI更新的次数,尽量批量更新UI,避免频繁调用UI更新方法。 7. 使用定时器避免阻塞主线程:通过使用定时器(Timer)或者Handler的postDelayed()方法,将一些可能引起阻塞的操作延后执行,避免在主线程中长时间执行。 8. 使用线程池:使用线程池来管理线程,避免频繁创建和销毁线程的开销。 9. 检查和优化代码:定期检查代码,查找和消除潜在的性能问题,如内存泄漏、死锁等。 10. 使用性能分析工具:使用Android Studio提供的性能分析工具,如Profiler、Traceview等,来分析应用的性能瓶颈,并优化相应的代码。 综上所述,通过合理的线程管理、使用异步操作、优化代码逻辑等方法,可以有效解决Android应用中的ANR问题,提升应用的响应性能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值