HWUI源码剖析(一) - 渲染中RenderProxy视角看一种很有用的编程模式

第 25 章:View 系统与输入事件分发 LayoutInflater 运行时将 XML 布局资源转换成 View 对象,连接 res/layout 下声明式 XML 和内存中程序视图树。来源:frameworks/base/core/java/android/view/LayoutInflater.java (第 74 行)...创建自定义 View 需要理解并实现正确的回调方法。默认 onMeasure 实现 wrap_content 会填满父容器;自定义 View 需要正确处理测量模式。@Override// 固有尺寸像素。 阅读详情

概述

实际的工程项目中,往往都是多线程编程,也就是必然有某些业务逻辑或者功能要运行在特定的线程,比如android开发中常见的IO线程,UI线程,Render线程,这样会涉及从线程A向这些工作线程通信或者函数调用的代码编程,具体实现上可以有多种多样,但是他们的核心思想其实都是一致的,Android Handler/Looper视角看UI线程的原理_nginux的博客-优快云博客

这篇文章中介绍的Looper/Handler机制其实就是很精妙的一种,其他的具体编程也往往跟这种思想是一致的,只是根据不同的业务场景,编码形式上面稍作改变,本文将介绍的是阅读Android HWUI中RendProxy和DrameFrameTask以及RenderThread源码的一种类似的编程模式。

业务场景及设计思想

假设我们的工作的业务模型描述如下:需要在线程A处理各种业务逻辑,那么就需要一个类实现一些接口类A来向B线程发送消息,线程A在没有消息的时候休眠,有消息之后取出处理,这里面涉及几个核心问题:

  1. 接口类A怎么给线程B发送消息,包括重要参数传递,以及拿到返回值。
  2. 线程B怎么做到没有消息时候休眠,有消息之后处理,这里面最重要的是线程B的收消息处理的实现代码,是否要跟消息发送方耦合(比如代码上要知道发送消息的ID,参数类型等)。

上述编程模式的代码实现上,往往我们成为接口类A为xxxProxy,相应的android hwui中名字叫做RenderPrody;线程B必须有一个线程循环体,不断取出消息并处理,具体到这里,由于是函数调用,基于面向对象的编程思想,这里的”消息“我们可以封装程一个类对象,android hwui中这里叫做:RenderTask,由于这个消息必须”可执行“,所以这个RenderTask得具备一个run()函数,同时基于多态的思想,这个RenderTask的run()可执行是个基类接口,因为具体”可执行“的任务可能有多种类型,比如渲染,函数调用等,所以同时可以定义一个函数调用的RenderTask,android Hwui中叫:MethodInvokeRenderTask,由于函数调用包括:函数体,参数和返回值,所以MethodInvokeRenderTask类中必须有表示函数体,参数和返回值的成员变量。

上面的设计模式有一种好处就是:把整个函数调用的执行最终封装成一个函数调用,这样在Proxy里面把对应的函数指针封装到类MethodInvokeRenderTask中,具体在线程中循环取出”消息“(Task)只要执行对应的函数体就好了,相对比还有一种实现模式类似Looper/Handler:向线程B发送消息消息的时候,给”消息”按ID分类,那么B线程收到处理的时候,按ID分别实现对应的处理函数,整个是不是特别类似Looper/Handler。而本文介绍的模式不需要显示按ID来实现,只要四号线一个函数处理实体就好了,线程B收到相应的“消息”,把参数取出来,调用对应的函数实体就好了。

源码实现

class ANDROID_API RenderTask {
public:
    ANDROID_API RenderTask() : mNext(nullptr), mRunAt(0) {}
    ANDROID_API virtual ~RenderTask() {}

    ANDROID_API virtual void run() = 0;

    RenderT
SurfaceFlinger学习笔记(五)之HWUI 渲染机制的更新,Android提出了硬件加速的机制,其作用就是将2D的绘图操纵,转换为对应的3D的绘图操纵,这个转换的过程,我们把它叫做录制。需要显示的时候,再用OpenGLES通过GPU去渲染。界面创建时,第一次全部录制,后续的过程中,界面如果只有部分区域的widget更新,只需要重新录制更新的widget。录制好的绘图操纵,保存在一个显示列表DisplayList中,需要真正显示到界面的时候,直接显示DisplayList中的绘图 操纵。这样,一方面利用GPU去渲染,比Skia要快;另一方面,采用Dis 阅读详情

相关推荐

光耦CTR参数实战:如何避免误触发与功耗陷阱(附计算公式)

本文深入解析光耦CTR参数在电路设计中的关键作用,探讨如何平衡误触发风险与功耗表现。通过TLP521、PC817等常见型号的实测数据对比,提供不同工作状态下的选型策略和计算公式,帮助工程师优化设计,提升系统稳定性和能效。

2a4s6d8f0g的博客 323

langchain4j+milvus实战

本文主要研究一下如何使用langchain4j来对接向量数据库milvus。

go4it 1472

UE5网络模块实战:属性复制、RPC与联机开发踩坑指南

多人联机开发中,网络同步是核心难题。UE5网络模块以服务器权威为基础,通过Actor复制、RPC和所有权机制实现多端状态一致。理解属性复制与OnRep回调、区分Server/Client/Multicast RPC的适用场景,是构建稳定联机架构的关键。本文结合数字孪生与多端协作场景,探讨如何将渲染与逻辑分离,并针对打包后网络失效、端口防火墙、崩溃排查等工程实践问题给出解决方案。通过蓝图接口解耦表现层,利用C++创建StaticMesh组件实现服务器逻辑与客户端表现分离,同时注意专用服务器不加载渲染依赖(如D

weixin_29010003的博客 269

【WorkBuddy专栏52】Codex与WorkBuddy生态适配、用户争夺与未来走向(下)

【WorkBuddy专栏52】Codex与WorkBuddy在中国大陆的发展——生态适配、用户争夺与未来走向(下)

AI人人懂 677

使用机器学习算法预测黄金价格

在本文中,我们将使用线性回归、XGBoost和LSTM这三种不同的机器学习算法来预测黄金价格。接下来,我们使用线性回归、XGBoost和LSTM分别建立了模型,并进行了训练和预测。这些机器学习算法可以帮助我们对黄金价格进行预测,但请注意,市场价格受多种因素影响,因此预测结果可能并不完全准确。接下来,我们需要对数据进行一些预处理,以便用于机器学习模型的训练和测试。我们将使用80%的数据作为训练集,20%的数据作为测试集。最后,我们将绘制每个模型的预测结果,并将其与实际价格进行比较,以评估模型的性能。

QromMatlab的博客 1316

置顶必读(1) | 滚雪球学Oracle教程导航帖,带你弯道超车(持续更新中)

什么是数据库管理系统(DBMS),Oracle在行业中的领先地位Oracle数据库的市场竞争与主要应用场景Oracle数据库的核心功能模块与未来技术发展趋势约束的高级应用:主键、唯一性、外键设计与管理表分区、视图、同义词与序列的最佳实践PL/SQL编程的设计哲学,如何高效使用Oracle SQL DeveloperPL/SQL代码调试与优化技巧RAC集群中的高可用性设计,负载均衡与并行查询的配置集群中的缓存一致性管理。

**My Coding Family** 1万+

【Unity】网络游戏实战(序章)MMORPG大型多人在线角色扮演 + 中国象棋联网对战

本系列会基于两种常见的网络游戏类型(MMORPG大型多人在线角色扮演和多人棋牌),从零开始实现网络游戏开发中的大多数环节。【杜绝代码炫技】本系列杜绝代码炫技,摈弃那些高深的设计模式,一切业务逻辑的实现代码追求浅显易懂,即便是网络编程菜鸟,也能循序渐进掌握本系列的核心要点。【授之鱼也授之渔】与一些开源库那样只授予源码不同,本系列还会基于各个技术要点展开详解,并结合切实的可直接运行的Demo,授之鱼更授之渔。

神码编程 1960

Python爬虫教程:抓取电商网站评论(以淘宝和京东为例)

通过本文的介绍,我们学会了如何使用Python编写爬虫,抓取淘宝和京东等电商平台的商品评论数据。我们介绍了如何使用电商平台提供的开放API以及如何通过模拟浏览器来抓取动态加载的数据。此外,我们还讨论了如何应对反爬虫技术,如何存储抓取的数据等。爬取电商平台的数据是一个强大的工具,能够为市场分析、消费者行为研究、产品优化等领域提供有力的支持。然而,在使用爬虫技术时,我们必须遵循法律法规,尊重平台的隐私政策,避免滥用数据。

2201_76125261的博客 1737

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: Android Handler/Looper视角看UI线程的原理
下一篇: HWUI源码剖析(二) - 终于讲清楚OpenGL渲染的MVP矩阵的来龙去脉
OS技术解密
博客等级 码龄16年 3760粉丝 189原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值