一种安卓系统View管理方法、存储介质、设备及系统转让专利

申请号 : CN201811161752.0

文献号 : CN110968741B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 尹成

申请人 : 武汉斗鱼网络科技有限公司

摘要 :

本发明公开了一种安卓系统View管理方法、存储介质、设备及系统,涉及安卓应用开发领域,该方法包括在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集;使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。本发明能够有效提升对View的查找速度。

权利要求 :

1.一种安卓系统View管理方法,其特征在于,包括:在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集;

使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;

基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;

对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记;

其中,所述最小空间占用的拓扑排序规则,具体为:(0)

初始化有向图的距离矩阵D =(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;

初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;

求和距离矩阵

选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;

将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。

2.如权利要求1所述的一种安卓系统View管理方法,其特征在于:所述onMeasure为计算View的大小,所述onLayout为计算View的位置,所述onDraw为绘制View。

3.如权利要求1所述的一种安卓系统View管理方法,其特征在于:所述对所有View进行收集,具体为:采用双重for循环方法,对ViewTree上所有节点的View进行收集。

4.如权利要求1所述的一种安卓系统View管理方法,其特征在于:所述对有向图进行拓扑排序,具体步骤包括:对有向图的布局方式进行判断:

若为向右的布局方式,则从有向图内部元素的第一个元素开始向后排序;

若为向左布局方式,则从有向图内部元素的最后一个元素开始向前排序。

5.权利要求1所述的一种安卓系统View管理方法,其特征在于:所述在onDraw阶段使用最长前缀匹配机制对View进行标记,具体步骤为:在onDraw阶段,获取View的ID;

获取View的内存地址的前16bit数值;

将获取的ID和前16bit数值进行拼接,形成整数型数值K;

获取有向图中节点View对应的键,将该键替换成整数型数值K。

6.权利要求5述的一种安卓系统View管理方法,其特征在于:对于有向图中的View,当对View进行查询时,使用查询函数findViewId,并基于整数型数值K,在有向图中对View进行查找。

7.一种存储介质,该存储介质上存储有计算机程序,其特征在于:所述计算机程序被处理器执行时实现以下步骤:在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集;

使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;

基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;

对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记;

其中,所述最小空间占用的拓扑排序规则,具体为:(0)

初始化有向图的距离矩阵D =(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;

初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;

求和距离矩阵

选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;

将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。

8.一种电子设备,其特征在于,所述电子设备包括:收集单元,其用于在ayout阶段之前的onMeasure阶段,对所有View进行收集;

导入单元,其用于使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;

排序单元,其用于基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;

标记单元,其用于对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记;

其中,所述最小空间占用的拓扑排序规则,具体为:(0)

初始化有向图的距离矩阵D =(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;

初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;

求和距离矩阵

选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;

将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。

9.一种安卓系统View管理系统,其特征在于,包括:收集模块,其用于在ayout阶段之前的onMeasure阶段,对所有View进行收集;

导入模块,其用于使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;

排序模块,其用于基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;

标记模块,其用于对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记;

其中,所述最小空间占用的拓扑排序规则,具体为:(0)

初始化有向图的距离矩阵D =(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;

初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;

求和距离矩阵

选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;

将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。

说明书 :

一种安卓系统View管理方法、存储介质、设备及系统

技术领域

[0001] 本发明涉及安卓应用开发领域,具体涉及一种安卓系统View管理方法、存储介质、设备及系统。

背景技术

[0002] 安卓程序的用户交互界面中,每一个可见的图像基本单元为View(视图),所有的View组成了可视化交互的界面,View与View间存在两种关系:一种是继承关系,另一种是非继承关系。继承关系,即View与View是一种父子或者爷孙关系,由于Java语言的单继承原则,一个View只能有一个父View,但一个父View可以有多个子View;非继承关系,即View与View之间不存在继承关系。在可视化的界面中,所有的View组成了一个树状图(视图树)关系,如图1所示。
[0003] View组成的这种树状图关系结构,优点是:各个View之间关系明确,不存在相互冲突和功能重叠,符合单一职责的设计模式。但基于这种树形依赖关系,必须为每个需要查找的View单独定义一个唯一的id(无需查找的View无需定义id),如果存在大量且功能重复的View则直接复用一个相同的id,但这样带来的弊端是,如果View数量庞大,则造成id泛滥,而复用相同id则导致View难以精确查找出来。为解决上述这个弊端,安卓系统官方建议为每个View额外绑定一个Tag(标识),然后通过Tag精确查找到对应的View,Tag的类型可以是整型数字(int),也可以是一个对象(Object)。这种绑定Tag的解决方案同时也存在一些缺陷,主要表现在以下方面:
[0004] 1、需要额外定义大量的Tag,一般为数字;
[0005] 2、查询效率低下,因为查询分为两步:先根据id查询,后根据tag查询,造成查询过程繁琐。

发明内容

[0006] 针对现有技术中存在的缺陷,本发明的目的在于提供一种安卓系统View管理方法、存储介质、设备及系统,能够有效提升对View的查找速度。
[0007] 本发明第一方面提供一种安卓系统View管理方法,包括:
[0008] 在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集;
[0009] 使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0010] 基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0011] 对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0012] 结合第一方面,在第一种可能的实现方式中,所述onMeasure为计算View的大小,所述onLayout为计算View的位置,所述onDraw为绘制View。
[0013] 结合第一方面,在第二种可能的实现方式中,所述对所有View进行收集,具体为:采用双重for循环方法,对ViewTree上所有节点的View进行收集。
[0014] 结合第一方面,在第三种可能的实现方式中,所述最小空间占用的拓扑排序规则,具体为:
[0015] 初始化有向图的距离矩阵D(0)=(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;
[0016] 初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;
[0017] 求和距离矩阵
[0018] 选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;
[0019] 将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。
[0020] 结合第一方面,在第四种可能的实现方式中,所述对有向图进行拓扑排序,具体步骤包括:
[0021] 对有向图的布局方式进行判断:
[0022] 若为向右的布局方式,则从有向图内部元素的第一个元素开始向后排序;
[0023] 若为向左布局方式,则从有向图内部元素的最后一个元素开始向前排序。
[0024] 结合第一方面,在第五种可能的实现方式中,所述在onDraw阶段使用最长前缀匹配机制对View进行标记,具体步骤为:
[0025] 在onDraw阶段,获取View的ID;
[0026] 获取View的内存地址的前16bit数值;
[0027] 将获取的ID和前16bit数值进行拼接,形成整数型数值K;
[0028] 获取有向图中节点View对应的键,将该键替换成整数型数值K。
[0029] 结合第一方面第五种可能的实现方式,在第六种可能的实现方式中,对于有向图中的View,当对View进行查询时,使用查询函数findViewId,并基于整数型数值K,在有向图中对View进行查找。
[0030] 本发明第二方面提供一种存储介质,该存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
[0031] 在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集;
[0032] 使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0033] 基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0034] 对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0035] 本发明第三方面提供一种电子设备,所述电子设备包括:
[0036] 收集单元,其用于在ayout阶段之前的onMeasure阶段,对所有View进行收集;
[0037] 导入单元,其用于使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0038] 排序单元,其用于基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0039] 标记单元,其用于对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0040] 结合第三方面,在第一种可能的实现方式中,所述onMeasure为计算View的大小,所述onLayout为计算View的位置,所述onDraw为绘制View。
[0041] 结合第三方面,在第二种可能的实现方式中,所述对所有View进行收集,具体为:采用双重for循环方法,对ViewTree上所有节点的View进行收集。
[0042] 本发明第四方面提供一种安卓系统View管理系统,包括:
[0043] 收集模块,其用于在ayout阶段之前的onMeasure阶段,对所有View进行收集;
[0044] 导入模块,其用于使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0045] 排序模块,其用于基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0046] 标记模块,其用于对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0047] 与现有技术相比,本发明的优点在于:通过使用有向图作为View收集器,对现有ViewTree上的View进行收集,并将收集的View作为有向图的元素导入至有向图中,对有向图中的View进行重新拓扑排序后,再对View重新进行onLayout和onDraw,且在有向图中,采用二次onLayout结合拓扑排序来建立节点View的依赖关系,整个管理方法无需为大量View绑定Tag,同时也方便了后续对View的快速精确查找。

附图说明

[0048] 图1为本发明背景技术中所述View的树状结构示意图;
[0049] 图2为本发明实施例中一种安卓系统View管理方法的流程图;
[0050] 图3为本发明实施例中一种电子设备的结构示意图。

具体实施方式

[0051] 本发明实施例提供一种安卓系统View管理方法,通过将View导入有向图中,然后对有向图中的View进行拓扑排序,方便对于View的查询和排布。本发明还相应的提供了存储介质、设备和安卓系统View管理系统。
[0052] 以下结合附本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0053] 参见图2所示,本发明实施例提供的一种安卓系统View管理方法的一实施例包括:
[0054] S1:在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集。View(视图)是Android系统的一个超类,且是Android系统应用层界面可视化的基本组件单元。
[0055] 本发明实施例中,View原本存在于ViewTree中,在本发明实施例的安卓系统View管理方法是对ViewTree中的View重新进行onMeasure、onLayout和onDraw,实现View管理。ViewTree(视图树)是由一个根View派生出大量子View,然后子View又派生出多个子View,依次衍生出一个类似树形的结构关系。onMeasure为计算View的大小,onLayout为计算View的位置,onDraw为绘制View,三者的顺序是,先onMeasure,再onLayout,最后onDraw。
[0056] 本发明实施例中,因为在onLayout阶段,View在ViewTree上的节点位置已经确定,故在本发明实施例中,在onLayout阶段之前的onMeasure阶段对View进行收集。
[0057] S2:使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中。即本发明实施例的安卓系统View管理方法的管理框架基于有向图数据结构,而有向图能够被拓扑排序。有向图是一种数据结构,一个有向图D是指一个有序三元组(V(D),A(D),ψD),其中ψD)为关联函数,它使A(D)中的每一个元素(称为有向边或弧)对应于V(D)中的一个有序元素(称为顶点或点)对。
[0058] S3:基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0059] S4:对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记,方便后续对View的快速精确查找。
[0060] 可选地,在上述图2对应的实施例的基础上,本发明实施例提供的一种安卓系统View管理方法的第一个可选实施例中,对所有View进行收集,具体为:采用双重for循环方法,对ViewTree上所有节点的View进行收集,从而完成对于View的收集,即采用两次循环的方式,一个循环控制行,一个循环控制列,对于ViewTree上的节点,以行为单位,按照先从左至右,再从上至下的顺序,依次对ViewTree上的节点进行收集。双重for循环的主要实现代码如下:
[0061]
[0062]
[0063] 上述代码中,定义两个for循环,将View定义为需要查找的元素,i和j相当于外层和内层循环的循环变量,外层循环执行一次,内层循环执行多次,依此循环收集每个查找到的元素,同时枚举每个查找到的元素,判断是否为View,直至在ViewTree中遍历查找完所有的View,然后结束。
[0064] 可选地,在上述图2对应的实施例的基础上,本发明实施例提供的一种安卓系统View管理方法的第二个可选实施例中,最小空间占用的拓扑排序规则,具体为:
[0065] 初始化有向图的距离矩阵D(0)=(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;
[0066] 初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;
[0067] 求和距离矩阵
[0068] 选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;
[0069] 将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。
[0070] 本发明实施例中,因为加入有向图的元素是多节点的View,因此当View的节点很深时,所需要的存储空间越大,因此对这种多节点的拓扑排序进行改进,采用最小空间占用的拓扑排序规则,减少空间占用。
[0071] 可选地,在上述图2对应的实施例的基础上,本发明实施例提供的一种安卓系统View管理方法的第三个可选实施例中,对有向图进行拓扑排序,具体步骤包括:
[0072] 对有向图的布局方式进行判断:
[0073] 若为向右的布局方式(此为国际上通用的布局方式),则从有向图内部元素的第一个元素开始向后排序,即采用改进型的拓扑排序对有向图进行正向排序;
[0074] 若为向左布局方式(此为国际上通用的布局方式),则从有向图内部元素的最后一个元素开始向前排序,即采用改进型的拓扑排序对有向图进行反向排序。
[0075] 上述在收集了ViewTree上所有的节点View,这些节点View都保存在有向图中,但有向图中节点View之间的依赖关系仍然不明确,且无法实现对节点View的快速精确查找,每次查找节点View时都需要遍历整个有向图内的所有元素,故采用上述方式对有向图中国的所有节点View进行拓扑排序,然后再重新onLayout,重新onLayout并不会改变节点View在ViewTree上的位置,从而不会改变各个节点View之间的依赖关系。
[0076] 可选地,在上述图2对应的实施例的基础上,本发明实施例提供的一种安卓系统View管理方法的第四个可选实施例中,在onDraw阶段使用最长前缀匹配机制对View进行标记,具体步骤为:
[0077] 在onDraw阶段,获取View的ID;
[0078] 获取View的内存地址的前16bit数值;
[0079] 将获取的ID和前16bit数值进行拼接,形成整数型数值K;
[0080] 获取有向图中节点View对应的键,将该键替换成整数型数值K。
[0081] 本发明实施例中,当完成拓扑排序和重新onLayout后,View将进入onDraw阶段,此阶段View的空间位置以及大小已经完全确定,只是未进行绘制,故处于不可见状态,为了达到快速且精确地查找View,本发明实施例中不再采用传统的查找方式,而是采用最长前缀匹配查找机制对View进行标记,方便后续的查找。对于有向图中的View,当对View进行查询时,使用查询函数findViewId,并基于整数型数值K,在有向图中对View进行查找。
[0082] 本发明实施例中,对View的查询函数进行重构,采用最长前缀匹配查找机制,结合拓扑排序后的有向图,相比于未重构前的查询函数,在效率上具有明显优势,在具体的实际操作中,当节点View为100个时,采用本发明实施例的方法用时为21.46us,现有的方法用时93.62us,当节点View为500个时,采用本发明实施例的方法用时为23.98us,现有的方法用时120.98us,具有实质上的进步。
[0083] 本发明实施例的安卓系统View管理方法,通过使用有向图作为View收集器,对现有ViewTree上的View进行收集,并将收集的View作为有向图的元素导入至有向图中,对有向图中的View进行重新拓扑排序后,再对View重新进行onLayout和onDraw,且在有向图中,采用二次onLayout结合拓扑排序来建立节点View的依赖关系,整个管理方法无需为大量View绑定Tag,同时也方便了后续对View的快速精确查找。
[0084] 本发明实施例提供的一种存储介质的一实施例包括,存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
[0085] 在View的onLayout阶段之前的onMeasure阶段,对所有View进行收集;
[0086] 使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0087] 基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0088] 对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0089] 可选地,在上述存储介质实施例的基础上,本发明实施例提供的一种存储介质的第一个可选实施例中,存储介质可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是但不限于:电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD‑ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
[0090] 可选地,在上述存储介质的实施例及第一个可选实施例的基础上,本发明实施例提供的一种存储介质的第二个可选实施例中,计算机可读的信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、RF等等,或者上述的任意合适的组合。
[0091] 可选地,在上述存储介质的实施例及第一、第二个可选实施例的基础上,本发明实施例提供的一种存储介质的第三个可选实施例中,可以以一种或多种程序设计语言或其组合来编写用于执行本发明操作的计算机程序代码,所述程序设计语言包括面向对象的程序设计语言,诸如Java、Smalltalk、C++,还包括常规的过程式程序设计语言—诸如“C”语言或类似的程序设计语言。程序代码可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。
[0092] 参见图3所示,本发明实施例提供的一种电子设备的一实施例中,电子设备具体包括:
[0093] 收集单元,其用于在ayout阶段之前的onMeasure阶段,对所有View进行收集;
[0094] 导入单元,其用于使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0095] 排序单元,其用于基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0096] 标记单元,其用于对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0097] 本发明实施例中,View原本存在于ViewTree中,在本发明实施例的安卓系统View管理方法是对ViewTree中的View重新进行onMeasure、onLayout和onDraw,实现View管理。ViewTree(视图树)是由一个根View派生出大量子View,然后子View又派生出多个子View,依次衍生出一个类似树形的结构关系。onMeasure为计算View的大小,onLayout为计算View的位置,onDraw为绘制View,三者的顺序是,先onMeasure,再onLayout,最后onDraw。
[0098] 本发明实施例中,因为在onLayout阶段,View在ViewTree上的节点位置已经确定,故在本发明实施例中,在onLayout阶段之前的onMeasure阶段对View进行收集。
[0099] 可选地,在上述图3对应的实施例的基础上,本发明实施例提供的一种电子设备的第一个可选实施例中,最小空间占用的拓扑排序规则,具体为:
[0100] 初始化有向图的距离矩阵D(0)=(dij)m×m,(i,j=1,…,m),其中,m为排序次数,且为正整数,dij为权值;
[0101] 初始化拓扑排序前的集合dij={v0},其中v为有向图中图节点距离;
[0102] 求和距离矩阵
[0103] 选取所有距离矩阵中的最小版本:C(vk)=min{C(vi)},i=1,…m,其中,C(vk)为距离矩阵的最小版本;
[0104] 将距离矩阵的最小版本作为最小空间占用的拓扑排序规则。
[0105] 本发明实施例中,因为加入有向图的元素是多节点的View,因此当View的节点很深时,所需要的存储空间越大,因此对这种多节点的拓扑排序进行改进,采用最小空间占用的拓扑排序规则,减少空间占用。
[0106] 本发明实施例提供的一种安卓系统View管理系统的一实施例包括:
[0107] 收集模块,其用于在ayout阶段之前的onMeasure阶段,对所有View进行收集;
[0108] 导入模块,其用于使用有向图作为View收集器,将收集的View作为有向图的元素导入至有向图中;
[0109] 排序模块,其用于基于最小空间占用的拓扑排序规则,对有向图进行拓扑排序;
[0110] 标记模块,其用于对有向图中的View依次进入onLayout阶段和onDraw阶段,并在onDraw阶段使用最长前缀匹配机制对View进行标记。
[0111] 可选地,在上述一种安卓系统View管理系统的实施例的基础上,本发明实施例提供的一种安卓系统View管理系统的第一个可选实施例中,对有向图进行拓扑排序,具体步骤包括:
[0112] 对有向图的布局方式进行判断:
[0113] 若为向右的布局方式(此为国际上通用的布局方式),则从有向图内部元素的第一个元素开始向后排序,即采用改进型的拓扑排序对有向图进行正向排序;
[0114] 若为向左布局方式(此为国际上通用的布局方式),则从有向图内部元素的最后一个元素开始向前排序,即采用改进型的拓扑排序对有向图进行反向排序。
[0115] 上述在收集了ViewTree上所有的节点View,这些节点View都保存在有向图中,但有向图中节点View之间的依赖关系仍然不明确,且无法实现对节点View的快速精确查找,每次查找节点View时都需要遍历整个有向图内的所有元素,故采用上述方式对有向图中国的所有节点View进行拓扑排序,然后再重新onLayout,重新onLayout并不会改变节点View在ViewTree上的位置,从而不会改变各个节点View之间的依赖关系。
[0116] 可选地,在上述一种安卓系统View管理系统的实施例的基础上,本发明实施例提供的一种安卓系统View管理系统的第二个可选实施例中,在onDraw阶段使用最长前缀匹配机制对View进行标记,具体步骤为:
[0117] 在onDraw阶段,获取View的ID;
[0118] 获取View的内存地址的前16bit数值;
[0119] 将获取的ID和前16bit数值进行拼接,形成整数型数值K;
[0120] 获取有向图中节点View对应的键,将该键替换成整数型数值K。
[0121] 本发明实施例中,当完成拓扑排序和重新onLayout后,View将进入onDraw阶段,此阶段View的空间位置以及大小已经完全确定,只是未进行绘制,故处于不可见状态,为了达到快速且精确地查找View,本发明实施例中不再采用传统的查找方式,而是采用最长前缀匹配查找机制对View进行标记,方便后续的查找。对于有向图中的View,当对View进行查询时,使用查询函数findViewId,并基于整数型数值K,在有向图中对View进行查找。
[0122] 本发明实施例的安卓系统View管理系统,通过使用有向图作为View收集器,对现有ViewTree上的View进行收集,并将收集的View作为有向图的元素导入至有向图中,对有向图中的View进行重新拓扑排序后,再对View重新进行onLayout和onDraw,且在有向图中,采用二次onLayout结合拓扑排序来建立节点View的依赖关系,整个管理方法无需为大量View绑定Tag,同时也方便了后续对View的快速精确查找。
[0123] 本发明不局限于上述实施方式,对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也视为本发明的保护范围之内。本说明书中未作详细描述的内容属于本领域专业技术人员公知的现有技术。