[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]
[*][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();