Looper类:
为一个线程开启一个消息循环,里面有一个消息队列,新线程是没有开启消息循环的,所以需要用到Looper的方法创建消息循环(主线程除外,主线程会自动为其创建Looper对象,开启消息循环),
MessageQueue存放消息和事件
Handler类:
辅助类,向绑定的Looper投递消息
Looper原型:
Looper.prepare()
Looper.loop
Looper.quit
代码:
- package com.test.looper;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Looper;
- import android.os.Message;
- import android.util.Log;
- public class MainActivity extends Activity {
- private LooperThread looperThread;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- looperThread = new LooperThread();
- looperThread.start();
- looperThread.getHandler().sendEmptyMessage(1);
- }
- class LooperThread extends Thread {
- private Handler mHandler;
- private final Object mSync = new Object();
- public void run() {
- Looper.prepare();
- synchronized (mSync) {
- mHandler = new Handler(){
- @Override
- public void handleMessage(Message msg) {
- Log.d("CYQ", "--->" + msg);
- }
- };
- mSync.notifyAll();
- }
- Looper.loop();
- }
- public Handler getHandler() {
- synchronized (mSync) {
- if (mHandler == null) {
- try {
- mSync.wait();
- } catch (InterruptedException e) {
- }
- }
- return mHandler;
- }
- }
- public void exit() {
- getHandler().post(new Runnable(){
- public void run() {
- Looper.myLooper().quit();
- }});
- }
- }
- }
1、new Handler()必须在子线程的run方法中,否则不是子线程的Handler
2、在getHandler方法中,我加入了同步,防止线程start了,但是并没有run结束,若此时直接返回mHandler会是一个null(不行可以试试,我一开始郁闷许久,最后在源码中发现有更稳定的实现,所以效仿了,
后记:
看来源码还是写得很健壮的,仍需多加学习!
总结一下(也许不对,请怀疑):
一个线程有一个对应的Looper,这个Looper就是消息循环,我理解就是提供了一个消息循环的场所,但是消息的投递,消息的处理它不做,它会绑定一个Handler,然后Handler去投递和处理消息,一个线程中实现handleMessage,另外一个线程就可以sendMessage,线程可以主或者子,进而实现线程间消息的传递。