Android ANR异常及解决方法

 

ANRs (“Application Not Responding”),意思是”应用没有响应“。


 

在如下情况下,Android会报出ANR错误:

– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件

– BroadcastReceiver 没有在10秒内完成返回

通常情况下,下面这些做法会导致ANR

 

1、在主线程内进行网络操作

2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)

应用应该在5秒或者10秒内响应,否则用户会觉得“这个应用很垃圾”“烂”“慢”…等等

逻辑应该是
1. new出一个新的线程,进行数据请求
2. 获取数据后,调用handler.sendMessage方法
3. 在handler的handle()方法中更新UI

 

这样就可以,或者也可以这样
private Thread mthread;
private Handler mhandler;
oncreate:
mthread = new Thread(runnable);//这里是在主线程中创建一个子线程,不会阻塞UI
mthread.start();

private Runnable runnable = new Runnable (){
           void run(){
                //做耗时的数据处理
                //处理完毕
                mhandler.sendEmptyMessge(1000);//这里发消息通知UI可以更新了
           }

};

mhandler = new Handler(){
              void handleMessgae(Message msg){
                    if(msg.what == 1000){
                        //更新UI
                    }
                    super.handlMessgae();
              }
};

  • 9
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ANRApplication 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、付费专栏及课程。

余额充值