Handler主要实现主线程与子线程之间的相互通信
Handler主要由四部分组成
<1>Looper.prepare();
<2>Handler handler=new Handler();
<3>handler.sendMsg()在子线程中执行
<4>Looper.loop();
注意:在Activity中Activity已经帮我们创建了Looper.prepare()和Looper.loop()
<1>Looper.prepare()的功能:1.创建了Looperd对象,然后Looper对象中创建MessageQueue(消息队列)
2.并将Lopper与当前线程绑定ThreadLocal
<2>Handler handler=new Handler()的功能:创建了Handler对象,并从当前线程中获取Looper对象,
然后获取MessageQueue( 消息队列)
<3> handler.sendMsg()的功能: 1.找到MessageQueue对象
2.然后msg.target=this,将handler对象成为msg的一个成员变量
3.最后把msg添加到MessageQueue中
<4>Looper.loop的功能:1.从当前线程中找到之前创建的Looper对象,然后找到MessagQueue对象
2.开启死循环,遍历消息队列中的消息
3.当获取到msg的时候,调用msg的handler的dispatchMsg方法,让msg执行
handler.sendMsg();
找到MessageQueue对象
然后msg.target=this,将handler对象成为msg的一个成员变量
最后把msg添加到MessageQueue中
下面是我写了单纯的一个主线程给子线程发送消息的小demo
public class MainActivity extends Activity {
private Handler handler;
private Looper myLooper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(new Runnable() {
public void run() {
/**
* 1.创建了Looperd对象,然后Looper对象中创建MessageQueue
* 2.并将Lopper与当前线程绑定ThreadLocal
*/
Looper.prepare();
/**
* 创建了Handler对象,并从当前线程中获取Looper对象,然后获取MessageQueue( 消息队列)
*/
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 1) {
Toast.makeText(MainActivity.this, msg.obj.toString(), Toast.LENGTH_LONG).show();
}
}
};
myLooper = Looper.myLooper();// 获取looper对象,以便在activity退出时looper对象销毁
Looper.loop();
}
}).start();
}
// 按钮点击事件
public void sendMsg(View view) {
handler.obtainMessage(1, "我是主线程发送来的消息呀!").sendToTarget();
}
@Override
protected void onDestroy() {
if (myLooper != null) {
myLooper.quit();// looper退出
myLooper = null;
}
}
}