全面理解Handler第一步:理解消息队列,手写消息队列

所以我们可以看到,Handler机制的思路可以说是一个颇为常见的设计。

既然本质是消息队列,是不是我们自己也可以写一套消息队列来感受一下Handler的设计思路呢?没错,接下来让我们一起实现一套简单的消息队列:

3、手写消息队列

我们先来捋一捋思路:

Looper中创建了MessageQueue,Handler之中又通过ThreadLocal拿到主线程new出来的Looper,因此Handler就持有了MessageQueue,又因此线程间是内存共享的,所以子线程可以通过Handler去往MessageQueue之中发送Message。

Looper.loop()死循环轮询MessageQueue,拿到Message就回调其对应的方法。

这样整个Handler机制就运转起来了。接下来我们就依靠这个思路,实现自己的消息队列,为了代码更简洁,以及和Handler机制产生区别,我这里省略一些操作比如ThreadLocal之类的。

3.1、代码实现

代码结束后有解释

全面理解Handler第一步:理解消息队列,手写消息队列

这里没有使用Looper这种思想,因为Looper本质就是使用ThreadLocal创建一个和主线程唯一关联的Looper实例,并以此保证MessageQueue的唯一性。

知道这个原理之后,这个demo。直接在主线程中new MessageQueue(),是同样的道理,然后调用loop()方法死循环轮询MessageQueue中的Message,不为null则执行。

main()方法中start了一个子线程,然后sleep3秒后,往MessageQueue中post Message。效果很简单,我猜很多小伙伴已经猜到了:

贴一下MessageQueue和Message

全面理解Handler第一步:理解消息队列,手写消息队列

3.2、思考存在的问题

细心的小伙伴,可能有留意到loop()方法执行后有这么一行代码,然后效果图中并没有被打印:

全面理解Handler第一步:理解消息队列,手写消息队列

当然这是必然的,毕竟我们的loop()是一个死循环,后边的代码是不可能被执行的。其实我们ActivityThread中调用了Looper.loop()之后,也没有任何代码了。

这里可能有小伙伴有疑问了。loop()死循环了,那么我们在主线程中的生命周期回调怎么办?岂不也不被执行了?其实不然,通过上述的消息队列,我们就能看出:我们在手写的这个demo中,loop启动前start了一个子线程,由子线程发送Message交由loop去执行。保证了消息的流畅性。

那是不是我们Android中的loop也是这种思路?没错,main中的loop启动前,的确会起一个子线程……

不要着急,关于这个问题,让我们下篇文章再展开~

结尾

今天这篇文章是全面理解Handler机制的第一篇,内容大多并没有直切到Handler机制本身,而是从外部去思考Handler的设计。而接下来的内容则是对Handler内部源码进行剖析了。

希望可以对小伙伴们有所帮助,如果感觉有收获,欢迎点赞,收藏,关注呦~


分享到:


相關文章: