手写Handler

重识handler机制并自己手写一个handler框架 最近重新学习了handler,以及handler的源码 通过看handler原理 ,了解到handler中使用了生产者模式-消费者模式所以想着自己写一个框架然后自己写了一个简单的handler框架 有问题或者见解的朋友欢迎评论区留言讨论,首先看下面这张图,handler的基本流程图 生产者:往队列添加消息,当队列满的时候,不能再添加消息了,此时block(即消息阻塞了),当生产一个消... 阅读详情

研究通了Handler的原理,自己手写了个简易的Handler。 此处的Queue直接采用了java里现成的LinkedBockingQueue

XHandler: 根据Android Handler原理手写了个简易的Handler

Handler

class XHandler {
    XLooper mLooper;
    XMessageQueue mQueue;
    public XHandler() {
        this(XLooper.myLooper());
    }

    public XHandler(XLooper looper) {
        mLooper = looper;
        mQueue = looper.mQueue;
    }

    void dispatchMessage(XMessage msg) {
        if (msg.callback != null) {
            msg.callback.run();
        } else {
            handleMessage(msg);
        }
    }

    void sendMessage(XMessage msg) {
        msg.target = this;
        mQueue.enqueueMessage(msg);
    }

    void postMessage(Runnable runnable) {
        XMessage msg = new XMessage();
        msg.callback =runnable;
        sendMessage(msg);
    }

    void handleMessage(XMessage msg) {

    }
}

Looper

package team.todos.test.handler;

import android.util.Log;

class XLooper {
    private static final String TAG = "XLooper";
    XMessageQueue mQueue;
    Thread mThread;
    private static ThreadLocal<XLooper> sThreadLocal = new ThreadLocal<>();

    XLooper() {
        this(true);
    }

    public static void prepare() {
        prepare(true);
    }
    private XLooper(boolean quitAllowed) {
        mQueue = new XMessageQueue(quitAllowed);
        mThread = Thread.currentThread();
    }
    private static void prepare(boolean quitAllowed) {
        if (sThreadLocal.get() != null) {
            throw new RuntimeException("Only one Looper may be created per thread");
        }
        sThreadLocal.set(new XLooper(quitAllowed));
    }
    public static XLooper myLooper() {
        return sThreadLocal.get();
    }

    public static void loop() {
        final XLooper me = myLooper();
        if (me == null) {
            throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
        }
        final XMessageQueue queue = me.mQueue;;
        for (;;) {
            XMessage msg = queue.next();
            if (queue == null) {
                break;
            }
            msg.target.dispatchMessage(msg);
        }
        Log.e(TAG, "Loop END");
    }

    public void quit(){
        mQueue.quit();
    }

}

MessageQueue

package team.todos.test.handler;

import java.util.concurrent.LinkedBlockingQueue;

class XMessageQueue {

    LinkedBlockingQueue<XMessage> mQueue = new LinkedBlockingQueue<>();

    public XMessageQueue(boolean quitAllowed) {
    }


    public XMessage next() {
        try {
            return mQueue.take();
        } catch (InterruptedException e) {
            return null;
        }
    }

    public void enqueueMessage(XMessage msg) {
        try {
            mQueue.put(msg);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void quit() {
        mQueue.clear();
    }
}

手写一套Java的Handler程序,深入理解Android消息机制 立即下载

相关推荐

【TELEMAC V8P4】TELEMAC-2D 用户手册核心概念与应用场景速览

本文深入解析了TELEMAC-2D水动力模型的核心概念与应用。作为基于二维浅水方程的开源数值模拟工具,TELEMAC-2D广泛应用于河流动力学、洪水演进、污染物输运及泥沙运动模拟。文章结合用户手册与实战经验,详细拆解了其理论框架、关键物理过程(如湍流模型、干湿网格处理),并提供了从模型搭建、文件配置到典型场景(如工程评估、污染应急、洪水模拟)的实用指南,帮助用户快速掌握这一强大工具。

weixin_29200741的博客 163

手写Handler总结

1、首先通过Looper.prepare生成了一个全局的Looper对象,同时也生成了一个MessageQueue消息队列对象 2、模拟Activity中创建Handler对象,在Handler对象创建的同时,获取到了当前线程的Looper,并且根据当前线程的Looper获取到了当前线程的MessageQueue消息队列 3、重写Handler的handlerMessage(Message message)方法,这个方法用于子类处理子线程的消息。 4、创建子线程,第一步就是实例化Message消息,第

chirchillhe的博客 366

在MCUXpresso上通过J-link烧写KW45

背景: KW45B是nxp 的ble npi产品,其使用的IDE为MCUXpressso或者IAR,MCUXpressso有一些bug,但是由于MCUXpressso阅读查找代码相对IAR容易,所以我经常使用的MCUXpressso进行开发。当然IAR也有其优势,比如编译、烧写速度相对MCUXpressso更快,是比较通用的一个平台,而MCUXpressso是NXP独有的。 Kw45有两种烧写方式,一是使用MCUlink,二是使用Jlink。NXP ble 产品线提供的IDE资料里有最新的15.0版本的

weixin_41889258的博客 2859

手写一个简单的handler

之后加入我们要发送和接收数据,当然如果我们只发送一个数据,我们就可直接使用handler的方法,当我们有大量数据时呢,如果都使用send,势必会导致线程阻塞,所以我们就想着添加一个队列,我们先把要发送的数据添加进去,之后他们想要处理的数据在慢慢处理,于是我们就写了。他的key是当前线程, values我们可以存放一个looper,这样我们就可以得到这个唯一的looper了。这里就需要思考一个问题了,looper可以有多个吗,我们看个方法就明白了。这两个是主要方法,一个发,一个收。最后我们看下最终的调用。

weixin_65101089的博客 1092

【阿里云大模型高级工程师ACP学习笔记】2.8 部署模型

【摘要】本文主要分享自学阿里云大模型高级工程师 ACP 认证中《2.8 部署模型》的学习笔记。详细介绍学习目标、梳理涵盖的知识点并评估其重要性和难易度,对既重要又困难的知识点进行重点分析,旨在为对阿里云大模型学习和认证感兴趣的读者提供学习思路和经验参考。

davidkorhenn的博客 2060

《数学建模与数学实验》第5版 线性规划 习题3.4

1. 某鸡场有1000只鸡,用动物饲料和谷物混合喂养. 2. 某工厂用A1,A2两台机床加工B1,B2,B3三种不同零件. 3. 某工厂利用两种原料甲、乙生产$A_1、A_2、A_3$三种产品. 4. 每班的护士在值班开始时向病房报到,连续工作8个小时. 5. 某工厂生产 A1 、A2 两种型号的产品 6. 有两个煤厂A,B 7. 某工厂制造三种产品,生产这三种产品需要三种资源 8. 已知某工厂计划生产1,2,3三种产品,各产品需要在ABC设备加工。...

hexiaosi_的博客 2万+

handler源码分析--以及手写一个handler

(注意:子线程可以创建Handler,一个线程可以创建多个Handler对象,但一个线程只能对应一个Looper对象,这是ThreadLocal机制,一个Looper对应一个MessageQueue。(3)为什么使用while循环,而不是if语句:因为有可能在别处没有初始化mLooper变量的地方使用了synchronized代码,并且用的锁是同一个对象,并且在里面调用了notifyAll,从而把getLooper方法给唤醒,如果使用if语句,那被唤醒之后,mLooper变量还是为null。

qq_40032848的博客 257

基于FPGA的示波器设计

ADC 、DAC、FPGA、LCD液晶、示波器

FDL_AQ的博客 1万+

Android手写Handler框架

Handler消息机制几乎是现在android面试中出现概率很高的一个问题,当然不建议大家去把这个过程背下来,有经验的面试官,很可能随便一问就问出来,所以连接handler机制的原理是非常重要的,这篇文章从handler的源码分析开始,顺便着手写一个handler简易框架,也顺便复习下,因为公司搬迁,我也要准备出去找工作了。(强调一句,不要背面试题,一定要知道原理,这样你才能走的更远)

qq_16177199的博客 1154

ABAP BOM展开避坑指南:CS_BOM_EXPL_MAT_V2函数参数配置详解

本文深入解析了SAP ABAP开发中用于物料清单展开的核心函数CS_BOM_EXPL_MAT_V2。针对其复杂的参数配置,如CAPID、STLAN、DATUV和MEHRS,提供了详细的避坑指南和最佳实践,帮助开发者避免数据错误与性能陷阱,实现高效、准确的BOM多层展开。

pea55的博客 854

具身大小脑全栈全网独家复现|LLM链式推理+边缘VLA感知+毫秒级运动小脑、优化人形步态僵硬运动滞后、打通思考-行走-操作全链路适配居家工业多场景落地

高层决策大脑(异步10Hz,GPU算力):轻量化机器人微调LLM+RhinoVLA边缘视觉大模型,负责自然语言链式工序拆解、全局环境语义感知、目标物体筛选、跨机器人动作适配,输出粗粒度运动目标,不介入底层伺服计算;依托View Registry实现异构机器人动作对齐,适配多形态机器人切换;中层调度小脑(硬实时1kHz,CPU算力)

qq_36130719的博客 255

Android 手写一套Handler

上一篇,详细分析了原理和handler机制的源码(传送门 -> https://blog.youkuaiyun.com/yaojie5519/article/details/100579131) 这一篇,将自己动手“丰衣足食”,尝试手写一套Handler代码 一、分析 按照上一篇内容,画出UML类图(只包含主要的部分方法)如下: 注意几个类的关系和主要方法。 上一篇内容有几个点需要补充一下...

KWMax 383

如何获取不同分区模板的基因表达矩阵,abagen: Allen 大脑图谱遗传数据工具箱的使用笔记

基因表达从根本上塑造了人类大脑的结构和功能结构。像Allen人脑图谱这样的开放获取转录组数据集提供了前所未有的能力来检查这些机制。abagen工具箱,这是一个用于处理转录组学数据的开放获取软件包,并使用它来检查方法可变性如何影响使用Allen人脑图谱的研究结果。

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 3340

手写Handler架构

在了解Handler原理的同时可以翻看源码研究一下Handler架构,下面是本人手写的Handler架构 Message.java public class Message { int what; Handler target; } Message类我写的很简单,源码中是有很多代码的,这里能够传递值的参数只有what。target对象主要是为了最终能够执行到handl...

weixin_43887839的博客 318

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

java中手写handler_教你手写Java层handler机制

handler消息框架1.Looper是消息循环类,负责从消息队列取消息,然后通过handler转发给UI线程,它包含mQueue成员变量,mQueue是一个消息队列MessageQueue。2.MessageQueue是消息队列类,它包含了mMessages成员;mMessages是消息Message的实例。MessageQueue提供了next()方法来获取消息队列的下一则消息。3.Messa...

weixin_42351362的博客 246

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

教你手写Java层handler机制

handler消息框架1.Looper是消息循环类,负责从消息队列取消息,然后通过handler转发给UI线程,它包含mQueue成员变量,mQueue是一个消息队列MessageQueue。2.MessageQueue是消息队列类,它包含了mMessages成员;mMessages是消息Message的实例。MessageQueue提供了next()方法来获取消息队列的下一则消息。3.Messag

猫的阁楼 2万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

手写handler原理实现

基于上篇文章研究了handler的源码(handler核心原理),自己想手动写下handler实现原理代码,项目结构如下:,自己写了个单元测试来模拟ActivityThread的启动,下面是ActivityThread中的main测试方法; @Test public void main(){ //创建looper Looper.prepare(); ...

yanjiabin159357的博客 300

【android】手写一套Java的Handler程序,深入理解Android消息机制

发现无论是Windows还是Android,它们都是利用消息机制来运行一个程序,使得程序能够持久的运行下去,那它们之间都有共同的特点,都属于CS端 那么为了更好的深入理解android的消息机制,我打算手写一个Java版的Handler来模拟Android程序运行 1.首先我创建了一些空白类,其中Main类是我们程序的入口 2.接着我们开始手写Looper 在Looper中我们知道有两...

天下武功唯CODING不破 5511

handler相关学习(一)手写Android消息机制

Android 的消息机制主要是指Handler得运行机制 以上模型的解释: 1.以Handler的sendMessage方法为例,当发送一个消息后,会将此消息加入消息队列MessageQueue中。 2.Looper负责去遍历消息队列并且将队列中的消息分发给对应的Handler进行处理。 3.在Handler的handleMes...

王温暖的博客 1883

Handler Message源码分析及手写实现

Handler Message源码分析及手写实现

星火幽光的博客 139

Handler深入(分析源码,手写一套Handler)

本文作者141-2018zho007博客:https://www.jianshu.com/u/e9cb5fd3aaa8声明:本文由作者 zho007 授权发布,未经原作者允许请勿转载 看到上面蓝色字了吗,点下吧前言在安卓当中提供了异步消息处理机制的两种方式来解决线程之间的通信,一种是是AsynchTask,另外一种就是现在我们主要分析的Handler。Handler是Android类库提供的用于接

刘桂林 1330

Android--源码分析Handler巧妙的观察者模式及手写简单实现Handler

说到Handler,绝大多数人都知道,它就是一个死循环,不断的遍历消息队列,通过handler将消息入队,循环中有消息就取出来消费掉,以实现线程间的通信。 说个题外话,记得有一次面试,面试官问我线程间怎么通信?我当时就很疑惑,线程间本来就是资源共享的,谈何怎么通信,调用线程的方法或者改变线程的变量值就可以实现通信了,只不过需要自己做一些线程同步的处理。对我们来说,Hanlder机制只是安卓SDK封...

aruba的博客 1883

【Android】Handler机制及其手写实现

1,UI只能在主线程中进行操作,否则程序异常。 以下就是一个错误的用法 public class DemoActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_serv

qq_40900926的博客 395

java中手写handler_Handler源码讲解+手写机制

摘自BAT面试宝典视频问题引入:点击后更新TextView重点:1 、不能在子线程更新UI2、OOM:HAndler使用不当可能引起内存泄漏3、Message的优化:要用Handler。obtainMessage()而不是new,会消耗内存。4、在子线程创建Handler,要准备Looper:Looper.prepare()。5、空指针异常:Handler消息处理完了单页面销毁了,就会抛出异常。H...

weixin_31263419的博客 246

java中手写handler_手写Handler架构

在了解Handler原理的同时可以翻看源码研究一下Handler架构,下面是本人手写的Handler架构Message.javapublicclassMessage{intwhat;Handlertarget;}Message类我写的很简单,源码中是有很多代码的,这里能够传递值的参数只有what。target对象主要是为了最终能够执行到handleMessage回调方法,具体作用可以在下...

weixin_29274337的博客 269
上一篇: Handler常见问题
下一篇: Electron 在 mac上无法复制粘贴
MorrisMao
博客等级 码龄18年 39粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值