Android多线程基础 子线程更新UI

学过一点Android的朋友都知道,Android的UI线程是不安全的,那么有没有相关为什么UI线程是不安全的呢?

UI线程不安全的原因,是因为UI线程是用来刷新界面的,会通过Android的invalidate()方法去刷新界面,但是invalidate不能再非UI线程去调用(原理就是你通过其他线程去调用这个方法,而UI线程也在调用这个方法,所以就会导致线程不安全了,而且在Android里面,这样做是不被允许的),所以更新UI只能在主线程。

但是有些时候我们要到子线程进行一些耗时操作,然后根据放回的结果更新UI,因此就有了Android提供的一套异步消息处理机制了。他可以完美的解决子线程更新UI的操作。

public class FragmentOne extends Fragment implements View.OnClickListener {
private static final int UPDATA=1;
    private Handlerhandler =new Handler(){
       @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
               case UPDATA:
              //更新UI的操作
              text.setText("我更新了")
              break;
        default:
               break;
            }
      }
};
......
@Override
public void onClick(View v){
    switch(v.getId()){
        case  R.id.bt:
              new Thread(new Runnable() {
                     @Override public void run() {
                          Message message =  new Message();
                           message .what = UPDATA;
                           handler.sendMessage(message)
                }
          }).start();
          break;
    default:
          break;
}

先定义一个整数常量UPDATA,用于表示更新UI的操作,然后新增了一个Handle对象,并且重写了父类的 handleMessage()方法,在这里对具体的Message进行处理,如果发现 Message的 What字段等于定义的 UPDATA,就执行更新UI的操作。

看看下面的点击事件,没有直接在里面更新UI,而是创建一个 Message 对象,并将它的 what 字段的值设置为我们定义的整数,然后调用 Hnandle 的sendMessage()方法将Message发送出去,然后 Handle 会收到这条信息,handlerMessage() 方法就会对他进行处理,注意:因为handlerMessage()方法就是在UI线程声明,所以它运行在主线程,接下来只要对 Message携带的 what 字段的值进行判断,如果等于定义的整数常量 UPDATA ,TextView 就会被更新。

这就是Android异步消息处理的基本用法,下次再来了解他的工作原理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值