实现图中的分享功能,代码如下:
先说下handler的三个构造函数开始我们的源码解析之旅吧。。。
(一)默认的构造函数
其中, MessageQueue mQueue存放消息的消息队列,Looper mLooper消息循环,Callback mCallback回调;
看下代码 mLooper = Looper.myLooper();
这里我们看下Looper的源码:
而这里的static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
发现在myLooper() 中得到的函数在prepare函数加入了消息循环的sThreadLocal.set(new Looper());
这里很好的说明了,我们在使用mylooper()的时候,需要先调用prepare()方法。
2. CallBack回调函数
这个构造函数与默认构造函数唯一不同的就是mCallback区别,那我们就分析CallBack这个接口吧!
这个其实就是在消息派发的时候,区分是在哪里处理消息的,如果Callback不为空,则消息就在他实现的这个借口的handleMessage()方法里处理。3. 传入消息循环Looper
这个是传入消息循环,而不是系统默认生成,而是我们自己创建或者从已有的消息循环拿过来使用
4.消息循环和CallBack回调函数
(二)消息的发送
handler如何把消息放入消息队列中吗?runable中的run()是如何被调用的????
1. 发送消息
MessageQueue queue = mQueue的消息队列是我们在创建消息循环Looper的时候创建的,这个可以看Handler的构造函数;
target是Handler类型的, 这样消息就可以把消息发送给各自的handler,这样就不会出现多个handler而消息换混乱的问题。。。。
他们的扩展函数:
1.
2.这里我们就可以看到,这里就吧what值付给类消息,再调用sendMessageDelayed函数发送消息,只是一个特殊情况而已。。。
3.
4.
5.
不难发现,3,4,5的函数中叶是同sendMessageAtTime来是实现,这里最重要的就是调用了getPostMessage() 这里其实也就把runbale赋值给了Message中Runnable callback(这里要注意,这个callback和handler中callback(ICallback)是不一样的)。
(三)从Handler中获取消息消息
还有四个同名的函数,他们的是实现都是通过Message.obtain()来实现的;不难发现,消息是从消息 池中取出来的,如果消息池中没有消息,则才回去此新生成一个;
当然,message中obtain方法也是有很多同名函数的,这里就不举例了。。。。
(四)消息的派发
这里有三种情况来处理消息:
(1)message中callback(Runable)不为空,即通过post把runable对象置入消息中;
这里就调用了需要实现的runable对象中的run()函数;
(2)mCallback(ICallback)不为空
我们只要实现这个接口就可以了。。。这个方法,好像使用的很少,不知哪位大师,可否指教下,什么情况下使用。。。。(3)(1)(2)都不满足的请款下,就调用了handleMesage函数
最后我们分析下消息循环Looper
1.构造函数
Looper的构造函数是私有的,在构造中生成了队列和获取当前的线程,
这里其实要注意的,发现前面文章中说的是有问题的,我们不难发现,如果我们在主线程中创建默认的handler,他其实创建获和取的消息循环的线程都是在主线程中,因为
而sThread的循环是new Looper实现的,而Lopper中就使用主线程。。。。所以我们前面说错了,这个线程虽然由系统产生,但是他也是主线程,所以以后操作最好使用ThreadHandler.
2.loop实现消息的死循环
这个函数式由系统调用的,所以我们才会说在主线程创建Hanler,不阻塞组线程,并且是异步的。。。。
这里最主要是派发消息和消息的回收。。。
以上就关于handler的源码解析,有问题,或者说错的请指教。。。。。。。
TextWatcher自身是一个接口,首先需要实现这个接口并覆盖其三个方法,分别为Text改变之前,改变之后以及改变的过程中各自发生的动作相应,这里我们只需要实现EditText在文本发生改变时候让TextView的内容跟着发生变化。