android在运行时改变ui需要在ui线程中修改才行,不然就会报错或者无法启动应用。

我们怎么可以做事不管呢?

既然不能在ui线程外的地方运行修改ui的代码,我们可以用Handler解决这个问题,

而Handler消息机制用于同进程的线程间通信,通过发送Message我们可以有效的避开报错。

那怎么写Handler才能帮我们修改指定的ui呢?

(^U^)ノ~YO 问对人了,我知道哦!!!

相关概念解释

  1. Message :代表一个行为what或者一串动作Runnable, 每一个消息在加入消息队列时,都有明确的目标Handler
  2. ThreadLocal: 线程本地存储区(Thread Local Storage,简称为TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。ThreadLocal的作用是提供线程内的局部变量TLS,这种变量在线程的生命周期内起作用,每一个线程有他自己所属的值(线程隔离)
  3. MessageQueue (C层与Java层都有实现) :以队列的形式对外提供插入和删除的工作, 其内部结构是以双向链表的形式存储消息的
  4. Looper (C层与Java层都有实现) :Looper是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给Handler处理
  5. Handler :消息的真正处理者, 具备获取消息、发送消息、处理消息、移除消息等功能

在我学习Handler时遇到了是否多的问题,在我的不断调试下我发现了。

两种可以有效修改ui的方法:

方法一:

重写Handler的handleMessage方法:

//直接写在类中
private final Handler handler = new Handler(Looper.myLooper()){
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        //在这写修改ui的代码
    }
};

调用:

handler.sendEmptyMessage(0);//写在非ui线程的地方

方法二:

new Handler().post(new Runnable() {//可以写在非ui线程的地方
                @Override
                public void run() {
                    //使用post方法更新UI
                }
            });

标签: none