Handler剖析
1.概念:
1.当运行项目时,会首先创建MainActivity,当用户进行一些处理例如,点击事件时,Ui会响应用户的操作,直接进行更新UI操作,但是当执行一些耗时操作时,必须在子线程中进行,子线程中无法更新UI,这就需要用到Handler的消息队列,发送Message消息队列,通过Handler进行Ui的更新Handler是Android提供的更新UI的一套机制,也是一套消息处理机制。可以使用它发送消息。也可以用它接收消息
2.为什么只有Handler才能更新UI
因为当使用多个线程去更新UI时,而且没有加锁机制,那么就会出现系统的错乱。如果加锁,则会导致ui的性能下降,用户体验不佳
针对上述的问题Android提供了Handler,这一套更新ui的机制。所以当我们更新ui的时候根本不用考虑多线程的问题,再更新ui的机制中,都是在主线程的消息队列中轮询处理的
2.原理图
3.Handler怎么用
message消息,time:每隔time的时间发送一次消息
sendMessage(Message message)
sendMessageDelayed(Message message,long time)
post(Runnable runnable)
postDelayed(Runnable runnable,long time)
4.Handler更新UI的四种方法
1.handler sendMessage:子线程发送消息到主线程,通过接收到的消息在主线程更新Ui
//主线程
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.setText(msg.what+"");
}
}
//子线程
new Thread(){
@Override
public void run() {
super.run();
try {
Thread.sleep(2000);
handler.sendEmptyMessage(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
2.handle post
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
handler.post(new Runnable() {
@Override
public void run() {
textView.setText("OK");
}
});
3.View post
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("OK");
}
});
}
}
4.runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("Odsd");
}
});
总结:以上四种方法岁都不同,但是本质都是根据handler的sendMessage()发送消息恒心Ui的,(详情请查看源码)
4.异常分析(Handler常见的两种异常)
译文:仅仅只有主线程可以更新Ui
//这是Handler的Android源码
mLooper = Looper.myLooper();
if (mLooper == null) {//当Looper为空时抛出异常
throw new RuntimeException(
"Can't create handler inside thread that has not called Looper.prepare()");
}
在子线程中创建Handler时必须指定Looper,否则会报出此异常