android Handler应用
android在运行时改变ui需要在ui线程中修改才行,不然就会报错或者无法启动应用。
我们怎么可以做事不管呢?
既然不能在ui线程外的地方运行修改ui的代码,我们可以用Handler解决这个问题,
而Handler消息机制用于同进程的线程间通信,通过发送Message我们可以有效的避开报错。
那怎么写Handler才能帮我们修改指定的ui呢?
(^U^)ノ~YO 问对人了,我知道哦!!!
相关概念解释
- Message :代表一个行为what或者一串动作Runnable, 每一个消息在加入消息队列时,都有明确的目标Handler
- ThreadLocal: 线程本地存储区(Thread Local Storage,简称为TLS),每个线程都有自己的私有的本地存储区域,不同线程之间彼此不能访问对方的TLS区域。ThreadLocal的作用是提供线程内的局部变量TLS,这种变量在线程的生命周期内起作用,每一个线程有他自己所属的值(线程隔离)
- MessageQueue (C层与Java层都有实现) :以队列的形式对外提供插入和删除的工作, 其内部结构是以双向链表的形式存储消息的
- Looper (C层与Java层都有实现) :Looper是循环的意思,它负责从消息队列中循环的取出消息然后把消息交给Handler处理
- 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
}
});