Android如何使用Handler

@author by Hs_ww_bin

出于性能优化的考虑,android的UI操作不是线程安全的,也就是说,android不支持子线程改变UI,因为如果多线程并发改变UI的话,会出现线程安全问题,相信学习过多线程并发的朋友们会很容易理解这一点。所以在android里面,只能通过主线程,或者说UI线程来修改Activity里面的UI组件。

这里又导致了另外一个问题,就是android分配给线程的时间是有限的,假如我们在UI线程里面有大量的操作,导致阻塞了,android就会出现"maybe too much work to do in main thread"的错误,但是这些操作不进行又不行。这个时候就可以用到Handler消息传递机制了。

一般如果有很多操作,比如算法,网络等等的,我们是不会再主线程里面进行的,一般是在新开的线程里面进行的。在新的线程里面执行完操作之后,假如这个操作时和UI有关的,我们不能马上就在新线程里面修改,要通过handler发送消息,然后在主线程里面接收消息,通过主线程修改UI界面。

handler的用法:

handler类包含如下方法:

void handlerMessage(Message msg):处理消息的方法,通常用来被重写。

final boolean sendMessage(Message msg)立即发送消息

final boolean sendMessageDelayed(Message msg,long delayMillis):指定多少毫秒之后发送

Message obtainMessage();获取消息

final boolean hasMessage(int what):检查消息队列中是否包含what属性为指定值的消息

下面举个使用handler的例子:

新的线程:

new Thread(){
      @Override
       public void run(){
               ArrayList list = new ArrayList();<span style="font-family: Arial, Helvetica, sans-serif;">       //通过各种运算来修改list的值</span>
               Message msg = new Message();
               msg.what = 0x000;//和主线程的匹配
               msg.obj = list;
               MainActivity.handler.sendMessage(msg);
       }
}.start();
然后在主线程里面:

public class MainActivity extends Activity {
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        handler = new Handler(){
            @Override
            public void handleMessage(Message msg){
                if(msg.what == 0x000) {
                         ArrayList list = (ArrayList)msg.obj;
                        //现在就可以运用在新线程里面弄好的arraylist的内容来对UI修改了。
                }
            }
        };
}
这样就可以实现在非UI线程里面通过传递消息的方式来修改UI界面了。

@Hs_wwbin  2014-8-8  16:22

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值