Handler解析

Handler 允许你发送和处理消息或者跟线程相关的Runable对象。每一个Handler实例被一个单线程以及线程的消息队列关联。当你创建一个新的Handler的时候,它被绑定到创建它的线程以及对应的消息队列。从这一点讲它们传递消息和runables到消息队列并且处理它们当它们从消息队列中出来的时候。


Handler有两个作用:
(1)调度消息和runable使其在以后某个时间点被执行
(2)在不同的线程上插入action并执行


Handler发送消息相关的函数有:
post(Runnable), 
postAtTime(Runnable, long),
postDelayed(Runnable, long), 
sendEmptyMessage(int), 
sendMessage(Message),
sendMessageAtTime(Message, long), 
sendMessageDelayed(Message, long) 

当你传递消息的时候,你可以让消息立即得到处理或者指定延迟的时间或者执行的时间,后面两种允许你完成timeouts, ticks, 以及其它 timing-based behavior

当一个进程被你的app创建的时候,主线程专门运行一个消息队列来管理顶层的app对象(activities, broadcast receivers, etc)以及任何它创建的窗口。你可以创建自己的线程并且用Handler和主线程通信。这些可以通过在你的新线程中通过调用post或者sendMessage函数来实现。给出的message或者runable将会在适合的时机在Handler的message队列中被调度。


1 数据成员
    final MessageQueue mQueue;
    final Looper mLooper;
    final Callback mCallback;
    final boolean mAsynchronous;
    IMessenger mMessenger;

2 一些重要的函数或者接口
2.1
public interface Callback {
        public boolean handleMessage(Message msg);
    }

当用此实例化一个Handler对象时候就不必要用子类继承Handler了

2.2
public void handleMessage(Message msg) {
    }

子类必须实现这个函数来接受消息。


2.3
   public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

这个用来处理消息,可以在Looper中的消息循环中看到这个函数被调用
2.4 
构造函数中重要的一个
public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }


        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

这个构造函数是很多Handler的构造函数都会调用的构造函数,从中可以看出,handler的成员mQueue,mLooper都是通过Looper.myLooper()函数获取的,从Looper的代码分析可以知道Looper对象是和创建它的对象一对一的关系,那么这里的Handler自然也就和创建它的对象相关了,必然的消息队列也是相关的了。(前提是构造函数中没有指定Looper)
public String getMessageName(Message message)
public final Message obtainMessage()


参考文献:
http://android.toolib.net/reference/android/os/Handler.html
http://www.cnblogs.com/codingmyworld/archive/2011/09/14/2174255.html
安卓源码



你可能感兴趣的:(android,handler,消息发送,消息接受,Looper关联)