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

相关文章

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

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数