Android Resource.getLayout函数分析-(基于10.0.0)

2024-01-06 21:18

本文主要是介绍Android Resource.getLayout函数分析-(基于10.0.0),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在分析LayoutInflater的时候有一处是需要根据资源ID生成一个XmlResourceParser对象的,这个是通过调用Resource类的getLayout函数实现的,该函数的代码如下

/frameworks/base/core/java/android/content/res/Resources.java

    public XmlResourceParser getLayout(@LayoutRes int id) throws NotFoundException {return loadXmlResourceParser(id, "layout");}

可以看出它内部是调用loadXmlResourceParser并传入“layou”来实现,看来loadXmlResourceParser函数是用来解析多种类别xml的,在Resources类中 getLayout、getAnimation、getXml都是在内部直接调用loadXmlResourceParser的,我们继续往下看

/frameworks/base/core/java/android/content/res/Resources.java

    XmlResourceParser loadXmlResourceParser(@AnyRes int id, @NonNull String type) throws NotFoundException {// 获取一个TypedValue对象,这里使用了一个单Item的对象池,减小对象的申请和释放final TypedValue value = obtainTempTypedValue();try {final ResourcesImpl impl = mResourcesImpl;// 根据资源ID获取对应的文件路径,然后把相关信息存储在value里面impl.getValue(id, value, true);if (value.type == TypedValue.TYPE_STRING) {// 根据文件路径创建XML解释器return impl.loadXmlResourceParser(value.string.toString(), id,value.assetCookie, type);}throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id)+ " type #0x" + Integer.toHexString(value.type) + " is not valid");} finally {// 将TypeValue对象归还给对象池releaseTempTypedValue(value);}}

先调用ResourcesImpl类的getValue函数获取XML文件的路径

/frameworks/base/core/java/android/content/res/ResourcesImpl.java

 void getValue(@AnyRes int id, TypedValue outValue, boolean resolveRefs)throws NotFoundException {boolean found = mAssets.getResourceValue(id, 0, outValue, resolveRefs);if (found) {return;}throw new NotFoundException("Resource ID #0x" + Integer.toHexString(id));}

在getValue中实际上调用了AssetManager.getResourceValue(); AssetManager是Android中的资源管理类,下一篇文章我们分析它

在通过AssetManager获取到资源ID对应的文件路径后调用ResourcesImpl类中的loadXmlResourceParser函数来获取XMLResourceParser

/frameworks/base/core/java/android/content/res/ResourcesImpl.java

XmlResourceParser loadXmlResourceParser(@NonNull String file, @AnyRes int id, int assetCookie,@NonNull String type)throws NotFoundException {if (id != 0) {try {synchronized (mCachedXmlBlocks) {// 在缓存中找已经缓存的XmlBlock,XmlBlock是一个编译过的xml文件final int[] cachedXmlBlockCookies = mCachedXmlBlockCookies;final String[] cachedXmlBlockFiles = mCachedXmlBlockFiles;final XmlBlock[] cachedXmlBlocks = mCachedXmlBlocks;// First see if this block is in our cache.final int num = cachedXmlBlockFiles.length;for (int i = 0; i < num; i++) {if (cachedXmlBlockCookies[i] == assetCookie && cachedXmlBlockFiles[i] != null&& cachedXmlBlockFiles[i].equals(file)) {return cachedXmlBlocks[i].newParser(id);}}// 没有已缓存的XmlBlock,就新建一个,并返回// Not in the cache, create a new block and put it at// the next slot in the cache.final XmlBlock block = mAssets.openXmlBlockAsset(assetCookie, file);if (block != null) {final int pos = (mLastCachedXmlBlockIndex + 1) % num;mLastCachedXmlBlockIndex = pos;final XmlBlock oldBlock = cachedXmlBlocks[pos];if (oldBlock != null) {oldBlock.close();}cachedXmlBlockCookies[pos] = assetCookie;cachedXmlBlockFiles[pos] = file;cachedXmlBlocks[pos] = block;return block.newParser(id);}}} catch (Exception e) {final NotFoundException rnf = new NotFoundException("File " + file+ " from xml type " + type + " resource ID #0x" + Integer.toHexString(id));rnf.initCause(e);throw rnf;}}throw new NotFoundException("File " + file + " from xml type " + type + " resource ID #0x"+ Integer.toHexString(id));}

到此我们就知道XmlResourceParser是怎么来的了

 

 

 

 

 

 

这篇关于Android Resource.getLayout函数分析-(基于10.0.0)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/577641

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT