重识handler机制并自己手写一个handler框架

本文介绍了如何重识Handler机制,并手写了一个简单的Handler框架。通过分析Handler的生产者-消费者模式,展示了Message、MessageQueue、Looper和Handler的实现,以及它们在消息传递过程中的角色。代码示例中包含了线程池的使用,以模拟多线程环境下的消息处理。
摘要由CSDN通过智能技术生成

最近重新学习了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 {

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值