最近在做安卓项目时,遇到一个问题,在工作线程中不能更新UI,否则会报错。可以使用Handle来实现在工作线程中更新UI。
Handler简单的使用方法
(1)先声明一个Handler对象,并初始化;
// 声明Handler对象,并初始化
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
// TODO 更新UI
textView.setText("Hello, World!"); //textView是一个TextView的对象,通过 TextView textView= (TextView) findViewById(R.id.text);获取。 text是该TextView的id
break;
}
}
};
(2)在工作线程中调用handler来更新UI;
// handler的调用方法——该方法是在工作线程中被调用的
public void showMessage(String message) {
handler.sendEmptyMessage(0); // handler根据传递的参数来对应更新UI
}
Handler传递参数更新UI
(1)先声明一个Handler对象,并初始化;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
// TODO 更新UI
Bundle bundle = msg.getData();
String mess = bundle.getString("MESS");
textView.setText(mess); //textView是一个TextView的对象,通过 TextView textView= (TextView) findViewById(R.id.text);来获取。 text是该TextView的id
break;
case 1:
List<T> list = (List<T>)msg.obj;
showData(list); // 调用普通的方法
break;
case 2:
Map<T, T> map = (Map<T, T>)msg.obj;
showData(map); // 调用普通的方法
break;
}
}
};
(2)在工作线程中调用handler来更新UI,在调用的时候通过传参方式传递数据;
/*
* (1)传递简单的字符串
*/
public void showStringMessage(String message) {
Message mess = handler.obtainMessage(); // 先获得Message的对象
mess.what = 0;
Bundle bundle = new Bundle();
bundle.putString("MESS", message);
mess.setData(bundle);
handler.sendMessage(mess);
}
/*
* (2)传递对象——Map跟List均可以这样传递
* 传递List
*/
public void showObjectMessage(List<T> list) {
Message mg = handler.obtainMessage();
mg.what = 1;
mg.obj = list;
handler.sendMessage(mg);
}
/*
* 传递Map
*/
public void showObjectMessage(Map<T, T> map) {
Message mg = handler.obtainMessage();
mg.what = 2;
mg.obj = map;
handler.sendMessage(mg);
}