Android之ANR异常Application Not Response

本文深入探讨了ANR异常的概念及其对应用性能的影响,详细介绍了导致ANR异常的原因,并提供了有效的预防措施。通过将耗时操作移至新线程处理和使用Hanlder在主线程与新线程间进行界面操作,可以显著降低ANR异常的发生率,从而提升应用程序的响应速度和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ANR异常
        1.什么是ANR异常
                Application Not Response, 用户在界面上做了一个操作, 如果超过6秒程序未能响应, 系统则会抛出ANR异常
        2.怎么避免ANR异常
                比较耗时的操作(连接网络), 尽量不要在主线程中操作, 开启新的线程处理
                如果新线程中需要操作主线程创建的界面, 使用Hanlder处理
### Android 中 OOM 和 ANR 的原因及解决方案 #### 一、OOM(Out of Memory) OOM 是指应用程序使用的内存超出了系统分配的最大限制。以下是其主要原因及其对应的解决方法: - **大图片加载** 加载高分辨率图片时容易占用大量内存,尤其是在低配设备上。可以通过压缩图片尺寸或使用高效的图像处理库来减少内存消耗[^1]。例如,`Glide` 或 `Picasso` 可以自动调整图片大小并缓存数据。 ```java // 使用 Glide 加载图片 Glide.with(context).load(imageUrl).into(imageView); ``` - **Bitmap 处理不当** 如果未及时回收 Bitmap 对象,则可能导致内存泄漏。应始终在不再需要时调用 `recycle()` 方法释放资源。 ```java if (bitmap != null && !bitmap.isRecycled()) { bitmap.recycle(); } ``` - **内存泄漏** 静态变量持有 Context 引用或者长时间存在的对象未能被垃圾回收器清理都会引发内存泄漏。可以借助工具如 LeakCanary 进行检测和修复[^2]。 --- #### 二、ANRApplication Not Responding) 当主线程阻塞超过 5 秒时会触发 ANR 提示框。常见原因是耗时操作放在了 UI 线程中执行。以下是一些典型场景以及应对策略: - **网络请求同步等待** 同步 HTTP 请求会在主线程挂起直到完成响应,这将直接导致界面冻结。改用异步方式可有效缓解该问题。 ```java new Thread(() -> { try { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder().url("http://example.com").build(); Response response = client.newCall(request).execute(); // 异步实现 } catch (IOException e) { e.printStackTrace(); } }).start(); ``` - **数据库查询时间过长** 数据读写应该放到后台线程里进行以免影响用户体验流畅度。Room Persistence Library 支持 LiveData 类型返回值从而简化多线程管理流程。 ```kotlin @Query("SELECT * FROM users WHERE id LIKE :id LIMIT 1") fun getUserById(id: String): LiveData<User> ``` - **广播接收器延迟过多** 广播监听器内部存在复杂计算逻辑也可能造成短暂停滞现象。建议把繁重任务交由 IntentService 来承担。 ```xml <receiver android:name=".MyBroadcastReceiver"> </receiver> ``` ```java public class MyIntentService extends IntentService { @Override protected void onHandleIntent(Intent intent) { // 执行耗时工作... } } ``` --- ### 结论 针对上述两种异常情况采取适当措施能够显著提升 APP 整体表现力,在实际项目开发当中还需要持续关注性能指标变化趋势以便快速定位潜在隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值