最近重新学习了handler,以及handler的源码 通过看handler原理 ,了解到handler中使用了生产者模式-消费者模式 所以想着自己写一个框架 然后自己写了一个简单的handler框架 有问题或者见解的朋友欢迎评论区留言讨论,首先看下面这张图,handler的基本流程图
生产者:往队列添加消息,当队列满的时候,不能再添加消息了,此时block(即消息阻塞了),当生产一个消息的时候,通知消费者有消息可以消费了。
消费者:从队列消费消息(获取),如果队列为空,则block,当消费者消费了一个消息的时候,通知生产者可以再生产消息。
下图中是handler中各个条件 包括messageQ的执行图 由于再往底层是native了 研究不深 有兴趣的可以去研究研究
好了废话不多说 直接上代码 代码中有注释
//Message类
/*
* 需要发送的handler
*/
public class Message {
/**
* 需要发送的Handler
*/
public com.kj.handlerlib.Handler target;
public String what;
public Message(String what) {
this.what = what;
}
@Override
public String toString() {
return "what: " + what;
}
}
//消息队列MessageqQ
public class MessageQueue {
//消息队列
private static final int count = 50;
/**
* 使用阻塞队列BlockingQueue解决生产者消费者
* 主要作用是效仿android源码native层的唤醒和堵塞消息队列的问题
* android源码使用的native方法nativePollOnce(阻塞),nativeWake(唤醒),这里使用另一种java并发提供的阻塞队列类替换
*/
private final BlockingQueue<Message> mMessageQueue;
public MessageQueue() {
mMessageQueue = new ArrayBlockingQueue<>(count);
}
public void enqueueMessage(Message msg) {
try {