Handler和Thread-----处理耗时比较长的操作
参考网站:http://www.cnblogs.com/crazypebble/archive/2011/03/23/1991829.html
http://tansitongba.iteye.com/blog/1583263
在《解密Google Android》一书中,发现了这样一个启动线程的模型。利用该模型,我们可以把一些耗时的操作放到doStuff方法中去执行,同时在updateUIHere方法中进行更新UI界面的操作,就可以完成一个线程所需要的功能。其他的说明写在注释部分了。
Handler myHandler = new Handler() {
public void handleMessage(Message msg) {
updateUIHere();
}
}
new Thread() {
public void run() {
doStuff(); // 执行耗时操作
Message msg = myHandler.obtainMessage();
Bundle b = new Bundle();
b.putString("key", "value");
m.setData(b); // 向消息中添加数据
myHandler.sendMessage(m); // 向Handler发送消息,更新UI
}
}.start();
参考这个方法,我把耗时操作,放在新开的线程中,使用Handler得到线程中耗时操作所获得的数据,从而来对UI界面进行操作:
一:线程部分
Runnable myRunnable = new Runnable() {
public void run() {
/*********先睡一小段时间**********/
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
//读取最近联系人的数据
List<ContentValues> llistRenCont = ConnectRenContListDataHelper.getRenContList(
SmsDataHelper.getSmsDataList(MultiChoiceContactActivity.this),
CallLogDataHelper.getCallLogList(MultiChoiceContactActivity.this));
//读取群组的数据
/***********群组名数据**************/
List<ContentValues> llistGroupName = GroupDataHelper.getGroupDataList(MultiChoiceContactActivity.this);
/***********群组下各成员的数据**************/
List<ArrayList<ContentValues>> llistEachGroupItemData = GroupDataHelper.getGroupItemDataList(MultiChoiceContactActivity.this);
Message msg = onProRenAndGroHandler.obtainMessage();
msg.obj = llistEachGroupItemData;
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(LISTGROUPNAME, (ArrayList<? extends Parcelable>) llistGroupName);
bundle.putParcelableArrayList(LISTRENCONT, (ArrayList<? extends Parcelable>) llistRenCont);
msg.setData(bundle);
msg.sendToTarget();
}
};
new Thread(myRunnable).start();
二:handler部分
private class OnProRenAndGroHandler extends Handler {
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
listEachGroupItemData = (List<ArrayList<ContentValues>>) msg.obj;
Bundle bundle = msg.getData();
listGroupName = bundle.getParcelableArrayList(LISTGROUPNAME);
listRenCont = bundle.getParcelableArrayList(LISTRENCONT);
UpdateUIHere();
}
}
第一步:定义Handler
public Handler onProRenAndGroHandler = null;
第二步,给Handler赋对象
onProRenAndGroHandler = new OnProRenAndGroHandler();
第三步:开线程,处理耗时操作
第四步:定义Handler类,得到数据,对UI进行操作
本文介绍了一种在Android应用中将耗时操作置于后台线程执行,并通过Handler机制更新UI的有效方法。该方法避免了主线程阻塞,确保了良好的用户体验。
2920

被折叠的 条评论
为什么被折叠?



