掌桥专利:专业的专利平台
掌桥专利
首页

一种Android列表准确更新方法

文献发布时间:2023-06-19 09:58:59


一种Android列表准确更新方法

技术领域

本发明涉及一种更新方法,尤其涉及一种Android列表准确更新方法。

背景技术

目前Android列表采用了一系列的缓存技术,因此在需要更新列表的时候,无法准确找到需要更新的条目,往往是不得已将所有的条目都更新一遍,造成资源和性能上的浪费;同时如果一个条目内容过多,即使只是想刷新条目中的某个部分,也不得不刷新整个条目,造成资源和性能上的浪费。

目前对于准确更新技术,就需要在新旧数据之间计算出差异部分。目前Android系统提供了一个差异计算工具,可以对新旧数据计算其差异条目,和差异条目之间的差异部分;同时也提供了一套在后台线程进行差异计算的工具。但是现有Android系统提供的差异计算工具,存在以下缺点:

1)该工具只支持列表,而不支持其他的数据类型,不具备扩展性;

2)差异的计算是基于条目进行的,很多时候是列表的数据无变化,但是其他条件变化就会导致整个列表的视图发生改变,为了处理这个状况,就必须为列表的各个条目增加不必要的字段,并且当外部条件变化时,要同时更新列表中所有条目对于这个外部条件的映射,造成性能和内存上的浪费。

发明内容

为了解决上述技术所存在的不足之处,本发明提供了一种Android列表准确更新方法。

为了解决以上技术问题,本发明采用的技术方案是:一种Android列表准确更新方法,包括以下步骤:

一种Android列表准确更新方法,包括以下步骤:

步骤一:系统接收来自于用户根据其业务需要传入的老数据;

步骤二:系统接收用户提供的新数据;

步骤三:系统将内部的运行版本进行自增,作为该次数据更新的运行版本;

步骤四:检查用户新老数据集的内存地址;

步骤五:检查是否用户新数据集为空且老数据集不为空;

步骤六:检查是否用户新数据集不为空且老数据集为空;

步骤七:切换到后台线程,调用Android系统提供的差异计算算法进行差异计算;

步骤八:差异计算完成后,切换到主线程,检查当前的运行版本和系统内部的运行版本是否一致。

进一步地,步骤一中,系统接收来自于用户根据其业务需要传入的老数据包括:系统接收其继承自UpdateData的自定义数据类型,同时系统接收继承自UpdateDataDiffItemCallback的自定义的新旧数据之间的比对操作。

进一步地,步骤四的检查过程为:如果新老数据集的内存地址相同,则认为用户数据没有改变,不需要更新,结束此次更新操作。

进一步地,步骤五的检查过程为:如果成立,那么说明用户将数据进行了清空操作,此时执行快速删除操作即可,无需进行差异计算,快速删除操作完成后,执行视图更新,结束此次更新操作。

进一步地,步骤六的检查过程为:如果成立,那么说明用户只是进行了数据增加的操作,此时执行快速增加操作即可,无需进行差异计算,快速增加操作完成后,执行视图更新,结束此次更新操作。

进一步地,步骤八的检查过程为:如果当前的运行版本和系统内部的运行版本不一致,那么说明在计算期间又执行了数据更新操作,将本次差异计算的结果舍弃;如果当前的运行版本和系统内部的运行版本一致,那么说明计算期间没有执行数据更新操作,则本次差异计算结果为用户真正需要的结果,将本次差异计算的结果执行视图更新。

本发明提供了一套差异计算与更新执行功能,可以简便的在后台线程进行差异计算,并执行视图上的准确更新操作;同时,对其支持的数据进行抽象化,使得用户可以自定义传入的数据,支持除列表以外的更多类型和更多样的数据。

附图说明

图1为本发明的整体流程图。

图2为本发明的差异计算流程图。

图3为本发明差异计算方式的类图。

具体实施方式

下面结合附图和具体实施方式对本发明作进一步详细的说明。

如图1所示的一种Android列表准确更新方法,包括以下步骤:

步骤一:系统接收来自于用户根据其业务需要传入的老数据;系统接收其继承自UpdateData的自定义数据类型,同时系统接收继承自UpdateDataDiffItemCallback的自定义的新旧数据之间的比对操作;

UpdateData与UpdateDataDiffItemCallback这两者是系统运行的必要参数,而且与用户的业务息息相关,需要用户自行提供;

图3中,I表示interface,interface意为接口,是面向对象程序语言Java特有的一种抽象类型,它要求实现它的类都应该具有它所声明的成员变量和方法。接口不能进行实例化,而只能由普通的类实现接口来具备接口所定义的功能。所谓实例化指的是通过new指令获取接口的一个对象。

A表示abstract class,abstract class意为抽象类,是面向对象程序语言Java特有的一种抽象类型,在它之中可以定义普通的成员方法,也可以定义抽象的成员方法。

所谓抽象的成员方法,就是不具备具体实现的成员方法,所以抽象类不能实例化,只能通过别的类继承抽象类来给予抽象类的抽象方法以具体的实现内容。

抽象类A和接口I的区别在于,抽象类是一个类,Java中一个类只能唯一继承于一个类,但是却可以实现多个接口。

Boolean是面向对象语言Java中的一种类型,意为布尔类型。所谓布尔类型,就是只具备两种状态的类型,即下文所提到的true和false。一个布尔类型不是true(真),就是false(假)。

Object是面向对象语言Java的一种类型,意为对象。Object是Java中所有类的基类,也就是说,Java中所有的类,都继承于Object。

图3中Boolean、Object分别代表成员方法的返回值的类型。

areItemsTheSame、areContentsTheSame、getChangePayload即为下文所描述的UpdateDataDiffItemCallback类的成员方法。UpdateDataDiffItemCallback是一个抽象类,它必须由其他的类继承于它从而实现其功能。

由图3可以看出,areItemsTheSame和areContentsTheSame是倾斜体,这个类图中的倾斜体则说明了,这两个方法是抽象方法,是不具备默认实现的,需要用户传入的自定义的继承于UpdateDataDiffItemCallback的类进行实现。

而getChangePayload不是倾斜体,说明它是具备默认实现的,用户可以重载这个成员方法来实现用户自定义的功能,也可以不重载,使用其默认实现。

getChangePayload主要用于获取单个条目的变化内容,默认实现返回的是一个空值。考虑到用户有可能不需要那么精细的更新操作,只需要精细到条目级别,此时用户可以自主进行选择,如果用户需要非常精细的更新操作,重载getChangePayload()这个方法即可。

如图3所示,差异计算方式的类图说明如下,本类图包含了两个类:

一、UpdateData是用户应提供给系统的数据类型的基类,即上文中提到的数据的基本类型,用户传入系统的自定义数据类型,应继承UpdateData。

UpdateData中的data成员变量即用户列表的数据集合,其包含一个泛型参数T,通过将T指定为不同的类型,用户就可以构造包含不同类型的数据集合的数据。

同时,由于用户可以继承UpdateData,就可以对UpdateData进行扩展,例如增加成员变量,包括更多的会导致列表发生变化的变量,假设这个变量为a,当该变量发生改变时,传入一个新的UpdateData包含新的a即可实现视图的更新,只需更新一次;而原有的Android系统提供的方法需要将a包含进列表条目数据中,如果a发生改变,就必须更新所有的列表条目进行视图更新。

二、UpdateDataDiffItemCallback是用户应提供的数据类型的比对操作的基类,即上文提到的数据比对操作,用户提供给系统的比对操作,应继承于UpdateDataDiffItemCallback。

UpdateDataDiffItemCallback包含三个成员方法,他们的传入参数统一为oldItem,newItem,oldUpdateData,newUpdateData,这几个参数会在系统进行差异计算的时候自动传入,无需用户传入,用户需要使用这几个参数实现对应的成员方法从而定义比对操作。

对上述传入参数说明如下:

1.oldItem指的是本次更新操作中,老的数据集合中的条目,数据集合即为UpdateData中的data;

2.newItem指的是本次更新操作中,新的数据集合中的条目;

3.oldUpdateData指的是本次更新操作中的老的数据;

4.newUpdateData指的是本次更新操作中的新的数据。

oldItem和newItem主要是用于在新老数据集合条目之间的比对,oldUpdateData和newUpdateData主要用于会导致列表发生变化的其他变量之间的比对。

对UpdateDataDiffItemCallback包含的三个成员方法说明如下:

1.areItemsTheSame()是判断新旧条目是否本质上相同,如果本质上相同,返回true,否则返回false。

2.areContentsTheSame()是判断新旧条目是否完全相同,如果完全相同,返回true,否则返回false。

3.getChangePayload()是在新旧条目本质上相同,而又不完全相同时,获取其差异部分的方法。

本质上相同指的是此条目的数据的关键成员没有发生变化,例如一个名片中的人的id没有发生变化而只是其头像和昵称发生了变化,则认为本质上相同。

完全相同指的是此条目的数据的所有成员都没有发生变化;

系统首先会执行成员方法areItemsTheSame()判断新旧条目是否本质上相同;当新旧条目本质上相同时才会执行成员方法areContentsTheSame()判断是否完全相同,因为两个条目如果本质上都不相同,则他们肯定不可能完全相同。

当数据本质上相同而又不完全相同时,系统会自动调用getChangePayload()方法获取差异部分,例如上文中的名片,系统会调用getChangePayload()获取到变化了的头像和昵称,从而对该名片进行准确更新,即只更新名片的头像和昵称,名片的剩余内容如联系方式则不会更新。

通过新、老两种数据,用户就可以根据其业务内容,实现三个成员方法,从而定义不同的比对操作,即哪些成员的变化会导致条目本质上不同;当条目本质上相同而又不完全相同时,提供怎样的局部更新数据,都可以由用户自行提供,这样就保证了在不同业务内容下的灵活性。

UpdateDataDiffItemCallback具有两个泛型参数:D和U;

其中D是用户自定义的数据类型中的数据集合的条目的类型,即上文中的UpdateData中的T,而U是D对应的UpdateData;

通过进行巧妙的泛型设计,利用泛型机制,将D和U设定为对应的用户数据集合的条目类型和用户自定义的数据类型,就可以解决原有技术扩展性不足的问题,适配用户自定义的任何数据类型。

步骤二:系统接收用户提供的新数据;

步骤三:系统将内部的运行版本进行自增,作为该次数据更新的运行版本;

这里更新内部运行版本的原因在于,之后的差异计算操作是异步操作,当次数据差异执行的期间,用户也可能再次传入一个新版本的数据;通过这两个运行版本的比较,可以确定该次更新的数据是不是用户用户真正需要更新的数据,防止用户视图出现错乱。

步骤四:检查用户新老数据集的内存地址,如果两者的内存地址相同,则认为用户数据没有改变,不需要更新,结束此次更新操作;

步骤五:检查是否用户新数据集为空且老数据集不为空,如果成立,那么说明用户将数据进行了清空操作,此时执行快速删除操作即可,无需进行差异计算,快速删除操作完成后,执行视图更新,结束此次更新操作;

步骤六:检查是否用户新数据集不为空且老数据集为空,如果成立,那么说明用户只是进行了数据增加的操作,此时执行快速增加操作即可,无需进行差异计算,快速增加操作完成后,执行视图更新,结束此次更新操作;

步骤四、步骤五、步骤六称为快速比对,即它们最终无需进行差异计算,直接结束本次更新操作或者执行删除或者增加操作之后,执行视图更新,结束本次更新操作,由于差异计算是一个较为消耗资源的计算操作,因此先执行快速比对,可以尽可能减少资源上的消耗。

步骤七:切换到后台线程,调用Android系统提供的差异计算算法进行差异计算;

步骤八:差异计算完成后,切换到主线程,检查当前的运行版本和系统内部的运行版本是否一致:如果当前的运行版本和系统内部的运行版本不一致,那么说明在计算期间又执行了数据更新操作,将本次差异计算的结果舍弃;如果当前的运行版本和系统内部的运行版本一致,那么说明计算期间没有执行数据更新操作,则本次差异计算结果为用户真正需要的结果,将本次差异计算的结果执行视图更新。

这样就实现了在差异计算时进行线程切换,并且不会造成用户的视图显示出其不需要更新的内容,防止视图的错乱。

如图2所示,本发明差异计算的流程为:

接收到新数据之后,首先将内部的运行版本号进行自增,后续差异计算时会使用到;

然后对新老数据进行快速比对,如果新老数据都指向同一个内存地址,则认为其没有改变;如果新数据集为空,而老数据集不为空,则执行快速删除操作后,执行视图更新;如果老数据集为空,新数据集不为空,则执行快速增加操作后,执行视图更新;上述操作都不进行需要较大计算资源的差异计算;

如果不符合快速比对的条件,那么就切换到后台线程,执行差异计算,差异计算完毕后,切换回主线程,检测在执行差异计算前的运行版本和当前的内部运行版本是否一样,如果不一样,说明用户再次更新了数据,当前的这次差异计算的结果需要舍弃;如果两个运行版本相同,说明当前的数据就是用户给予的最新数据,则将该次差异计算结果用于更新视图。

本发明支持自定义数据类型:为了解决数据类型的扩展性的问题,对此仅提供了一个基本类型,仅包含一个数据集合字段,用户可以根据具体的业务情况,扩展这个基本类型来建构自己的自定义类型;针对这个基本类型,提供一套通过泛型技术来适配用户的自定义类型,让用户可以自定义该数据的差异计算方式的方法,这样,用户就能够针对不同的业务场景,对传入的数据进行自定义,大大提高了数据的扩展性;同时,提供的差异计算方式中传入了新、旧两种数据,所以可以做到用户将新数据中的一个字段进行改变,就能驱动多个列表条目进行变动,消除了因为需要更新多个映射造成的性能和资源上的浪费。

本发明通过对差异计算的数据提供基本的数据类型,方便用户针对不同业务场景进行扩展;通过改进差异对比方式,支持外部条件只改变一次就可以驱动多个列表条目进行更新,而不必更新多个映射值。

上述实施方式并非是对本发明的限制,本发明也并不仅限于上述举例,本技术领域的技术人员在本发明的技术方案范围内所做出的变化、改型、添加或替换,也均属于本发明的保护范围。

相关技术
  • 一种Android列表准确更新方法
  • 无线电通信系统、相邻小区列表优化系统、基站和相邻小区列表更新方法
技术分类

06120112375458