handler从我们开始学安卓到后面工作中,都在使用它,对于我而言其实就是知道它是发消息的,更新界面的,好像其他的也没有怎 么用,实际开发中我们很多时候对于一个zhis知识就是知道怎么用,要追究最根本的原因还是差一丢丢。所以自己今天就把自己理解的整理一番,参考的文献文章放在最后
Handler是什么呢?
很多时候我们说:“线程与线程间进行通信的一套机制”。也有说是:“handler是更新UI界面的机制,也是消息处理的机制,我们可以发送消息,也可以处理消息”
为什么会有这个Handler机制?
答:Android在设计的时候,封装了一套消息创建、传递、处理机制,如果不遵循这样的机制就没办法更新UI信息,就会抛出异常
Android为什么要设置只能通过Handler机制更新UI?
答:最根本的问题解决多线程并发的问题;
假设如果在一个Activity中,有多个线程去更新UI,并且都没有加锁机制,马么会产生生么样的问题?——更新界面混乱;
如果对更新UI 的操作都加锁处理的话会产生什么样子的问题?——性能下降
对于上述问题的考虑,Android提供了一套更新UI的机制,我们只需要遵循这样的机制就好了。
不用关心多线程的问题,更新UI的操作,都是在主线程的消息队列当中轮询处理的。
handler的机制原理是什么?
1、 Handler机制是由Looper和MessageQueue来构建消息机制的。
2、 Handler负责发送消息(发起者),Looper负责接收handler发送的消息(只可以接受)消息回传给handler自己(再把收到的球又抛回去给handler)。MessageQueue存储消息的容器(一个记录的人)。Message具体发送的消息(到底发了些啥,这里知道)。
HandlerThread的作用是什么?
答:HandlerThread thread=new HandlerThread("handler thread");自动含等待机制,等Looper创建好了,才创建Handler,避免出现空指针异常。
Looper 死循环为什么不会导致应用卡死?
线程默认没有Looper的,如果需要使用Handler就必须为线程创建Looper。我们经常提到的主线程,也叫UI线程,它就是ActivityThread,ActivityThread被创建时就会初始化Looper,这也是在主线程中默认可以使用Handler的原因。
android 中更新UI的几种方式
常见的大概有四种:runOnUiThread、handler post、handler sendMessage、view post
Handler handler = new Handler() {
// 实现一下Handler里面的handleMessage方法
public void handleMessage(android.os.Message msg) {
// 第二个方法是从外边拿到数据然后返回到里面
textView.setText("第二种方法handlerEmptyMessags");
}};
/**
* 第一方法 Handler post
*/
public void handler1() {
handler.post(new Runnable() {
@Override
public void run() {
// 这里弄个文本消息
textView.setText("第一种方法Handler post");
}});}
/**
* 第二种方法 sendEmptyMessage
*/
public void handler2() {
handler.sendEmptyMessage(1);
}
/**
* 第三种方法 runOnUiThread
*/
public void handler3() {
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText("第三个方方法runOnUiThread");
}});}
/**
* 第四种方法view
* post----它会判断当前是不是UI线程,默认情况下,会通过Handler.post发送一个action。如果是UI线程的话执行run()方法
*/
public void handler4() {
textView.post(new Runnable() {
@Override
public void run() {
textView.setText("第四种方法 view post");
}});}