一、什么是Handler
handler是因为android只能在主线程(UI线程)中更新界面,谷歌官方为我们提供的一个传递消息的帮助类。通过使用它可以解决线程不同步导致的UI界面混乱问题。
二、Handler的运行逻辑
先上代码(此为案例,handler应写在主线程中,不推荐这样写)
class Mythread extends HandlerThread{//可防止线程不同步导致的空指针错误
public Handler handler;
public Mythread(String name) {
super(name);
}
public Mythread(String name, int priority) {
super(name, priority);
}
@Override
public void run() {
Looper.prepare();//looper初始化
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
Log.i("TWO","MyThread线程Id = "+ Thread.currentThread());
}
};
Looper.loop();//looper启动
}
}
以上代码中可以看到需要启动handler,先要初始化Looper,最后要启动Looper
其中Handler相当于一个收发货物的工人,Looper是一个有序列的传送带,Message则是传送带上的货物。
三、利用Handler更新UI的四种方式
android中更新UI的四种方式
- 在子线程中调用handler.post()方法
- 在子线程中调用handler.sendMessage()方法
- 在子线程中调用Activity的runOnUiThread()方法
- 在子线程中调用view的post()方法
PS:其本质上都是通过调用handler的sendMessage方法来实现的。
private TextView textView;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
textView.setText("OK_2");
}
};
private void handler1(){//方法一
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("OK_1");
}
});
};
private void handler2(){//方法二
handler.sendEmptyMessage(1);
}
private void handler3(){//方法三
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("OK3");
}
});
}
private void handler4(){//方法四
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("OK4");
}
});
}