关于android中的ANR

本文探讨了Android应用中导致应用程序无响应(ANR)的原因及解决策略,重点介绍了如何将阻塞主线程的操作移至子线程处理,避免ANR现象的发生。通过实例展示了改进前后的代码对比,提供了实用的优化方法。

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

  • ANR简介 Android有专门的Thread来负责处理如下的case:
    1)在规定时间内没有响应用户输入(例如: 按键, 触摸屏幕)
    2)在规定时间内没有执行完毕BroadcastReceiver
    此时,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application NotResponding)对话框。
  • 避免ANR 引起ANR的本质原因是: 主(main) Thread 过于繁忙,不能处理用户输入。避免ANR就需要把那些阻塞main thread的东西,移植到子线程去作(下面分别是引起ANR的代码和 优化后的代码)。


//在onUpdate中获取到fields的更新值: 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);//通过指定handler发送消息 //在指定的handler中处理接受的消息: 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; } 主要是通过onupdate来监视数据更新, 然后通过handler来更新界面表中显示
优化后的代码:

// 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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值