让用户不再遭遇ANR

本文介绍了Android中应用程序无响应(ANR)的概念及如何避免。ANR出现的原因通常是主线程过于繁忙无法处理用户输入。文章提供了引发ANR的示例代码及优化方案,即通过将耗时操作移至子线程来提高应用响应速度。

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

[list]
[*][color=darkblue]ANR简介[/color]
[color=indigo] Android有专门的Thread来负责处理如下的case:
1)在规定时间内没有响应用户输入(例如: 按键, 触摸屏幕)
2)在规定时间内没有执行完毕BroadcastReceiver
此时,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application NotResponding)对话框。[/color]

[*][color=darkblue]避免ANR[/color]
[color=indigo] 引起ANR的本质原因是: 主(main) Thread 过于繁忙,不能处理用户输入。避免ANR就需要把那些阻塞main thread的东西,移植到子线程去作(下面分别是引起ANR的代码和 优化后的代码)。[/color]
[/list]


//cause ANR
public void onUpdate(int itemPos, final String itemName, UpdateInfo update) {
final String[] fields = new String[5];
fields[0] = notifyValue(update, X1);
fields[1] = notifyValue(update, X2);
fields[2] = notifyValue(update, X3);
fields[3] = notifyValue(update, X4);
fields[4] = notifyValue(update, X5);

Message msg = messageHandler.obtainMessage();
msg.what = MESSAGE_HANDLE_ID_UPDATEROW_DATA;
Bundle bundle = new Bundle();
bundle.putInt(MESSAGE_KEY_ID, Integer.parseInt(itemName, 10));
bundle.putString(X1, fields[0] );
bundle.putString(X2, fields[1]);
bundle.putString(X3, fields[2]);
bundle.putString(X4, fields[3]);
bundle.putString(X5, fields[4]);
msg.setData(bundle);
messageHandler.sendMessage(msg);
}


private Handler messageHandler = new Handler() {

@Override
public void handleMessage(Message msg) {

switch(msg.what) {
case MESSAGE_HANDLE_ID_UPDATEROW_DATA:{
int id = msg.getData().getInt(MESSAGE_KEY_ID);
String fields[] = new String[5];
fields[0] = msg.getData().getString(X1);
fields[1] = msg.getData().getString(X2);
fields[2] = msg.getData().getString(X3);
fields[3] = msg.getData().getString(X4);
fields[4] = msg.getData().getString(X5);
updateRowInTable(id, fields);
break;
}
}




// high performance
public void onUpdate(int itemPos, final String itemName, UpdateInfo update) {
final String[] fields = new String[5];
fields[0] = notifyValue(update, X1);
fields[1] = notifyValue(update, X2);
fields[2] = notifyValue(update, X3);
fields[3] = notifyValue(update, X4);
fields[4] = notifyValue(update, X5);

final Runnable myUpdateResults = new Runnable() {
public void run() {
updateRowInTable(Integer.parseInt(itemName, 10), fields);
}
};

new Thread() {
public void run() {
messageHandler.post(myUpdateResults);
}
}.start();

private Handler messageHandler = new Handler();
一、综合实战—使用极轴追踪方式绘制信号灯 实战目标:利用对象捕捉追踪和极轴追踪功能创建信号灯图形 技术要点:结合两种追踪方式实现精确绘图,适用于工程制图中需要精确定位的场景 1. 切换至AutoCAD 操作步骤: 启动AutoCAD 2016软件 打开随书光盘中的素材文件 确认工作空间为"草图与注释"模式 2. 绘图设置 1)草图设置对话框 打开方式:通过"工具→绘图设置"菜单命令 功能定位:该对话框包含捕捉、追踪等核心绘图辅助功能设置 2)对象捕捉设置 关键配置: 启用对象捕捉(F3快捷键) 启用对象捕捉追踪(F11快捷键) 勾选端点、中心、圆心、象限点等常用捕捉模式 追踪原理:命令执行时悬停光标可显示追踪矢量,再次悬停可停止追踪 3)极轴追踪设置 参数设置: 启用极轴追踪功能 设置角度增量为45度 确认后退出对话框 3. 绘制信号灯 1)绘制圆形 执行命令:"绘图→圆→圆心、半径"命令 绘制过程: 使用对象捕捉追踪定位矩形中心作为圆心 输入半径值30并按Enter确认 通过象限点捕捉确保圆形位置准确 2)绘制直线 操作要点: 选择"绘图→直线"命令 捕捉矩形上边中点作为起点 捕捉圆的上象限点作为终点 按Enter结束当前直线命令 重复技巧: 按Enter可重复最近使用的直线命令 通过圆心捕捉和极轴追踪绘制放射状直线 最终形成完整的信号灯指示图案 3)完成绘制 验证要点: 检查所有直线是否准确连接圆心和象限点 确认极轴追踪的45度增量是否体现 保存绘图文件(快捷键Ctrl+S)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值