1.概述:
handler是安卓提供的一套更新UI的机制,由于android不允许非UI线程更新UI,所以需要相关机制实现。同时hander也是一套消息处理机制,能实现主线程向子线程传递消息,子线程向主线程传递消息。
2.Looper、Message和Queue的关系
Looper是一个消息分发器,在主线程创建的时候就会创建一个Looper对象
messageQueue :消息队列,是由message组成的一个 队列handler:从messageQueue中获取到message,然后执行动作,可以再主线程和子线程中互相传递数据
在主线程创建之后会创建一个Looper对象,创建Looper对象的时候会去创建一个messageQueue,而Looper是一个轮询器,会不停的轮询messageQueue中的消息,在获取到消息之后就会把这个消息交给handler来进 行处理,在主线程中创建一个handler对象,这个handler对象不仅可以获取到消息进行处理,也可以把一个消息放到消息队列中。
3.处理消息的顺序:
首先是执行message中的回调方法Callback, 如果返回false 则执行Handler中的CallBack接口,返回message则执行HandlerMessage(里面的函数由开发者在其子类中实现)
4.实现handler的三种方式
1.使用主线程默认构造函数handler()由线程。Looper在主线程中
package com.example.handertest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class MainActivity extends Activity {
private TextView tv;
private static final int UPDATE = 0;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case UPDATE:
tv.setText(String.valueOf(msg.obj));
break;
default:
break;
}
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//TextView tv;
setContentView(R.layout.activity_main);
tv=(TextView) findViewById(R.id.tv1);
new Thread(){
public void run(){
for(int i=0;i<100;i++){
try {
Thread.sleep(1000);
Message msg=new Message();
msg.what=UPDATE;
msg.obj="更新后的内容"+i;
handler.sendMessage(msg);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Message msg=new Message();
msg.what=UPDATE;
msg.obj="更新后的内容"+i;
handler.sendMessage(msg);
}
}
}.start();
}
}
2.在主线程中创建handler指定主线程外的Looper
3.LooperThread主线程创建的handler运行在其中
package com.example.handertest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.widget.TextView;
/*
*
* 第2⃣️种为主线程中的handler指定Looper
*/
public class Handler_Thread extends Activity {
private static final int UPDATE = 0;
private TextView textView;
private HandlerThread thread;
private Handler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView)findViewById(R.id.tv1);
textView.setText("handlerThread");
//setContentView(R.layout.activity_main);
//thread=new HandlerThread("handler Thread");
//thread.start();
handler =new Handler();
handler=new Handler(handler.getLooper()){
@Override
public void handleMessage(Message msg) {
//Message message=new Message();
//handler.sendMessageDelayed(message, 2110);
//super.handleMessage(msg);
switch (msg.what) {
case UPDATE:
textView.setText(String.valueOf(msg.obj));
break;
default:
break;
}
}
};
new Thread(){
public void run(){
for(int i=0;i<100;i++){
try {
Thread.sleep(1000);
Message msg=new Message();
msg.what=UPDATE;
msg.obj="更新后的内容"+i;
handler.sendMessage(msg);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Message msg=new Message();
msg.what=UPDATE;
msg.obj="更新后的内容"+i;
handler.sendMessage(msg);
}
}
}.start();
}
}
Handler发送的消息可以运行在别的线程的上下文,但是其处理消息都是在其对应的Looper所在的宿主线程。