-
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();