Handler和Thread-----处理耗时比较长的操作

本文介绍了一种在Android应用中将耗时操作置于后台线程执行,并通过Handler机制更新UI的有效方法。该方法避免了主线程阻塞,确保了良好的用户体验。

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进行操作 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值