一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种适用于Android应用内的数据总线设计方法

2022-07-06 07:54:41 来源:中国专利 TAG:

一种适用于android应用内的数据总线设计方法
技术领域
1.本发明涉及智能终端开发技术领域,具体为一种适用于android应用内的数据总线设计方法。


背景技术:

2.随着智能终端的广泛应用,作为终端主流操作系统的android相关的开发也广泛展开。根据android应用程序的开发规范,需要将耗时任务放在后台线程中执行。但是,日常应用中,当任务执行完毕后,往往需要将执行结果显示在ui界面上。根据android应用程序开发规范,不允许后台线程直接修改ui界面,而是提供了handler消息机制修改ui界面,并提供了相应的api接口和编程方式说明。但使用handler消息机制编程比较繁琐,并且会使后台线程和ui界面间的耦合度非常高。
3.为此,为了提高开发效率,有技术人员设计了第三方总线技术,比如:当前较流行的eventbus事件总线框架,其为基于事件类型驱动的总线技术。在开发上可以大大降低组件间的耦合度,使用上也比较简单。但是,eventbus框架技术有个较大的缺点,不能大量使用事件,如果大量使用事件,则需要创建大量的事件消息类,当事件触发时,所有处理相同事件的处理方法都会执行一遍,在控制上不够精确、效率比较低。为了实现精确控制处理方法的运行,基于eventbus事件总线框架的应用在设计上、在维护众多事件上,需要的开发成本很高。


技术实现要素:

4.为了解决基于现有的第三方总线技术,进行组件之间或者组件与后台线程之间通信时,为了进行精确控制处理方法的运行,开发成本过高的问题,本发明提供一种适用于android应用内的数据总线设计方法,其运行在非跨进程场景下,不但简化了数据总线的驱动逻辑与事件消息实体类之间的关联,并降低了事件消息实体类与处理事件方法的耦合度,能以较高效率处理大量事件。
5.本发明的技术方案是这样的:一种适用于android应用内的数据总线设计方法,其特征在于,数据总线的结构中包括:注册表和数据流表;所述注册表以组件引用为索引,每个注册节点维护一个组件引用的信息;所述注册表的结构包括:组件引用、标签列表、邮箱表、事件处理方法、优先级;所述优先级决定每个组件接收事件的顺序;所述标签表的作用是提供与注册组件关联的标签列表的一览表,为组件的注册、注销等管理操作提供一致性检查样本;所述邮箱表为每个组件提供邮箱,所述邮箱中的邮件包含标签、源组件、消息内容3个要素,标签用于标定邮件类型、源组件用于标定发送者;每个组件只能使用一个所述事件处理方法,用这一个事件处理方法处理所有事件消息,通过标签区分事件的类型和数据类型。事件处理方法的名称自定义,参数限定为3个,分别是标签、消息数据对象、源组件引用,其中源组件引用参数用于目标组件得到事件的发
送者;所述数据流表以标签为索引,形成数据流表的基本结构,每个标签节点中包含组件表,各组件根据使用标签的优先级排列;所述组件表中的节点保存了所述注册表中注册节点的组件引用,复用了注册表中节点;基于所述注册表、所述数据流表,所述数据总线提供的操作包括:注册、注销、修改标签列表、事件消息发送和处理、邮箱消息发送和收取;组件使用所述数据总线时,为了保证正常运行必需使用的操作包括:注册、注销、事件消息处理操作,按照实际需要选择的操作包括:修改标签列表、事件消息发送和邮箱消息发送收取;基于所述注册表、所述数据流表实现的事件消息的分发,采用反射方式调用目标组件的事件处理方法方式分发;其中,目标组件的事件方法内不包括耗时代码;在非跨进程的场合,后台程序向ui主线程发送事件消息时,所述数据总线借助android系统的handler消息机制,通过handler消息机制切换到ui主线程中的handmessage()方法中,实现更新ui界面数据的操作;事件消息通过android提供的message消息类的obj成员携带传递,所述数据总线的结构中无需事件消息队列做缓冲。
6.其进一步特征在于:所述注册表基于哈希表实现,所述标签表基于哈希表实现,所述数据流表基于哈希表实现,所述组件表基于链表实现,所述邮箱表基于链表方式实现;所述注册的流程包括:待注册组件在注册操作时提供的注册信息包括:自身引用、优先级、使用的标签列表、事件处理方法的名称;进行所述注册操作时,定义事件处理方法,所述事件处理方法的参数包括: object类型的源组件引用参数、string类型的标签参数和object类型的消息参数;所述数据总线内得到所述注册信息后,检查待注册组件是否已经注册,如果已经注册则返回已注册信息;如果未注册则先创建注册节点,初始化待注册组件的节点并将组件信息加到节点中;然后根据待注册组件使用的标签,将待注册组件的注册节点挂接到数据流表中对应的标签节点下的组件表中;如果数据流表中无待注册组件的标签节点,则先在其中建立一个标签节点,再挂接待注册组件的注册节点;最后将注册节点加入到注册表中;所述注销的流程包括:组件销时需提供自身引用;待注销组件将自身引用发往数据总线,数据总线内得到信息后,检查待注销组件是否已经注册,如果未注册则返回注销成功信息;如果已注册,获得待注销组件的注册节点,并从注册表中移除;然后根据待注销组件使用的标签列表,一一从数据流表中对应标签节点的组件表中摘除待注销组件的注册节点;其中,如果摘除待注销组件后,标签节点的组件列表无任何其它组件,则将待注销组件的标签节点从数据流表中摘除;数据流表处理完毕后,释放待注销组件的相关资源;所述修改标签列表的流程包括:组件在完成注册操作后,根据需要增减使用的标签,使组件能更灵活地控制需要
响应的事件;有修改需求的组件将自己待修改标签需求发往数据总线,数据总线内得到修改标签信息后,先修改注册表中组件对应的标签列表;待修改标签需求包括:增加标签和减少标签;数据总线根据所述待修改标签需求中增加标签和减少标签,分别在数据流表中进行组件挂接和组件摘除操作,操作方式同注册流程和注销流程中的组件挂接和摘除操作;当组件提交的需求是减少标签时,在处理摘除组件操作过程中,仅清空邮箱中与减少标签对应的邮件,不释放邮箱;所述事件消息发送和处理流程包括:消息源组件发送事件消息;反射调用目标组件的事件处理方法来处理事件消息;消息源组件发送消息时,在事件消息发送流程中,需要提供的参数包括:标签、消息数据对象、组件自身引用和目标组件引用;数据总线内部通过标签在数据流表上得到使用消息源组件的标签的组件列表;如果消息源组件提供的参数中明确指定了目标组件,则只为目标组件分发消息,否则为组件列表中除消息源组件外的所有组件分发消息;接收到消息的目标组件在事件处理流程中,通过方法参数获得消息源组件的引用和事件消息,得到这些信息后就可以进行相应的处理;所述邮箱消息发送和收取流程:邮件发送组件发送邮件时,需要提供标签、消息数据对象、组件自身引用和目标组件引用参数;数据总线内部在数据流表上找到发邮件时参数中标定的标签和和标签对应的组件列表;如果邮件发送组件的参数中明确指定了目标组件,则只向目标组件投放邮件,否则向组件列表中除邮件发送组件外的所有组件投放邮件;邮件不触发执行事件处理方法的执行,而是由各组件主动去各自的邮箱中收取邮件;收取邮件时,各组件需要提供标签和组件自身引用参数,数据总线内部根据标签,从组件的邮箱中取出对应的邮件返回给组件,取出邮件后,将邮件从对应组件的邮箱中删除;所述数据总线采用单例方式,即一个进程中只有一个单例;基于android环境实现时,组件以类为单位,使用所述数据总线的类就是一个组件。
7.本发明提供的一种适用于android应用内的数据总线设计方法,其在处理非跨进程的应用内通信时,采用无事件消息队缓冲列的设计,简化了本发明的数据总线的结构和运行环节,并减少了实现本发明数据总线时的代码量,提高了程序效率;同时,基于于反射方式、发送消息时立刻执行,消息传递速度更快,进一步提高了程序效率。主动分发事件消息时,立刻检索数据流表并反射调用目标组件的事件处理方法、将事件消息发给目标组件。与现有总线技术相比,本发明中无事件消息队列的设计,简化了数据总线的设计,使数据总线在运行上和实现上都具有较高的效率。
附图说明
8.图1是注册表注册节点示意图;图2是数据流表标签节点示意图;图3是组件使用数据总线示意图;
图4是注册处理流程图;图5是注销处理流程图;图6是修改标签处理流程图;图7是发送事件处理流程图;图8是发送邮件处理流程图。
具体实施方式
9.本发明提供一种适用于android应用内的数据总线设计方法,本发明的数据总线设计方法适用于应用内通信,不适用于跨进程的通信。数据总线采用单例方式,即一个进程中只有一个单例;在android应用使用本方法时,方法中的组件是以类为单位,使用数据总线的类就是一个组件;本发明的数据总线设计,适合使用java技术实现。
10.本发明的数据总线内部主要使用了哈希表和链表两种基本数据结构,来支撑数据总线内的数据逻辑。所述注册表基于哈希表实现,所述标签表基于哈希表实现,所述数据流表基于哈希表实现,所述组件表基于链表实现,所述邮箱表基于链表方式实现。
11.总线的数据逻辑结构主体由两张表构成,分别是注册表和数据流表。
12.注册表的数据结构如图1所示,在注册表内记录了所有注册的组件。所述注册表以组件引用为索引,每个注册节点维护一个组件引用的信息;所述注册表包括:组件引用、事件处理方法(以事件处理方法的名称方式记录)、优先级、组件使用的邮箱表和标签列表。
13.所述优先级决定每个组件接收事件的顺序;所述标签表的作用是提供注册组件及其标签列表的一览表,为组件的注册、注销等管理操作提供一致性检查样本;所述邮箱表为每个组件提供邮箱,所述邮箱中的邮件包含标签、源组件、消息内容3个要素,标签用于标定邮件类型、源组件用于标定发送者。
14.每个组件只能使用一个所述事件处理方法,用这一个事件处理方法处理所有事件消息,通过标签区分事件的类型和数据类型。事件处理方法的名称由组件自行定义,参数限定为3个,分别是标签、消息数据对象、源组件引用,其中源组件引用参数用于得到事件的发送者。
15.如图2所示为数据流表的标签节点结构。所述数据流表以标签为索引,形成数据流表的基本结构,每个标签节点中包含一个组件表,各组件根据使用标签的优先级排列;所述组件表中的节点保存了所述注册表中注册节点的组件引用,复用了注册表中节点。基于数据流表的结构,本发明中数据流表的维护比较简单,仅处理好标签和组件的挂接和摘除即可,数据总线的实现时的开发过程得到了简化。
16.基于所述注册表、所述数据流表实现的事件消息的分发,采用反射方式调用目标组件的事件处理方法方式分发;其中,目标组件的事件方法内不能包括耗时代码,否则会阻塞数据总线的运行。
17.在非跨进程的场合,后台程序向ui主线程发送事件消息时,借助android系统的handler消息机制,通过handler消息机制切换到ui主线程中的handmessage()方法中,实现更新ui界面数据的操作;事件消息通过android提供的message消息类的obj成员携带传递,本发明无需再设计事件消息队列做缓冲。借助android系统handler消息机制的代码,实现本发明设计时封装进本发明的数据总线框架库,所以,开发者无需了解和编写与handler
消息机制相关的代码,降低了开发难度。
18.与现有数据总线技术性相比,本发明中的数据总线,基于标签驱动,通过标签定义事件类型,解耦实体类与事件的一一捆绑关系,所以更灵活。本发明事件处理方法只有一个:在该方法内用标签进行事件的分流处理,而event bus中用事件 事件处理方法分流,开发维护上本发明优势明显。在event bus中,当一个事件来了,会执行组件内所有处理该事件的事件处理方法,效率较低;而本发明回避了这种模式,提高了执行效率、降低了产生逻辑问题的概率,进而降低了设计成本。
19.基于所述注册表、所述数据流表,所述数据总线提供的操作包括:注册、注销、修改标签列表、事件消息发送和处理、邮箱消息发送和收取;组件使用所述数据总线时,必需使用注册、 注销、事件消息处理三种操作才能正常运行,而修改标签列表、事件消息发送和邮箱消息发送收取这些操作可以按需使用。
20.本发明技术方案中,在注册、注销和修改标签列表时,同时管理和维护了注册表和数据流表的主体数据结构,无需额外设计程序模块维护,进一步简化了数据总线的实现。
21.所述数据总线采用单例方式,即一个进程中只有一个单例;基于android环境实现时,组件以类为单位,使用所述数据总线的类就是一个组件。
22.如图3所示,数据总线需要提供获得单例对象、注册、注销、修改标签、发送事件、发送邮件和收取邮件几个方法。获得单例对象方法为static类型的类方法,其他几个方法为实例方法。组件需要先调用获得单例对象方法,获得数据总线对象后,才能使用数据总线提供的其它几个方法。本组件单例对象可以在类加载时实例化,也可以在调用获得单例对象方法内实例化,对象保存在static类型的类成员变量中。
23.所述注册的流程如图4所示。
24.待注册组件在注册操作时提供的注册信息包括:自身引用、优先级、使用的标签列表、事件处理方法的名称;进行所述注册操作时,定义事件处理方法,所述事件处理方法的参数包括:object类型的源组件引用参数、string类型的标签参数和object类型的消息参数。
25.所述数据总线内得到所述注册信息后,检查待注册组件是否已经注册,如果已经注册则返回true表示已注册。
26.如果未注册则先创建注册节点,保存组件对象引用、标签列表、优先级、事件方法名,并初始化一个邮箱链表。注册节点准备完成后,进行下一步。
27.遍历待注册组件的标签列表,对表中每个标签,在数据流表上检索,进行挂接操作:如果待注册组件的标签节点已存在,根据优先级将注册节点引用插入到组件表;如果待注册组件的标签节点不存在,则先创建一个标签节点,并初始化组件表,将注册节点引用加入组件表。标签节点准备完成后,将标签节点加入数据流表。
28.标签列表处理完成后,将注册节点加入到注册表中。
29.返回true,表示注册成功。
30.所述注销的流程如图5所示。
31.组件销时需提供自身引用;待注销组件将自身引用发往数据总线,数据总线内得到信息后,检查待注销组件
是否已经注册,如果未注册则返回注销成功信息,这样的设计,简化了注销处理操作,降低了开发难度。
32.如果已注册,获得待注销组件的注册节点,并从注册表中移除待注销组件。
33.然后遍历待注销组件的标签列表,对每个标签,在数据流表上检索,做以下摘除操作:从该标签节点的组件表中,移除待注销组件的注册节点;检查标签的组件表中是否还有组件,如果没有组件,说明该标签无任何组件使用,则从数据流表中该标签节点,并清空和释放标签节点内引用的资源。
34.标签列表处理完成后,释放注册节点中的资源,并将该节点内的组件对象引用、标签列表、事件方法名、邮箱链表等成员变量置null。返回true,表示注销成功。
35.所述修改标签列表的流程如图6所示。
36.组件在完成注册操作后,根据需要增减使用的标签,使组件能更灵活地控制需要响应的事件。
37.有修改需求的组件将自己待修改标签信息发往数据总线,数据总线内得到修改标签信息后,先修改注册表中组件对应的标签列表;待修改标签信息包括:增加标签和减少标签。
38.数据总线根据所述待修改标签信息中是增加标签还是减少标签,分别在数据流表中进行组件挂接和组件摘除操作,操作方式同注册流程和注销流程中的组件挂接和摘除操作;两种操作都不增加或删除注册表中的注册节点。
39.增加标签操作,包括:先在注册表中提出需求的组件的注册节点中,加入新增的标签。考虑开发者容易出错,标签可能会有重复,所以内部增加这种冗余处理,对已加入的不重复加入,仅进行安全检查。对每个新增标签,在数据流表中,进行挂接组件和标签的操作,本步操作同注册方法中的操作。挂接完成,返回实际增加的标签数量。
40.删除标签操作:先在注册表中提出需求的组件的注册节点中,删除标签。考虑开发者容易出错,可能会有事先未注册的标签,所以内部增加这种冗余处理,仅进行安全检查,不删除不存在的标签。
41.对每个删除标签,在数据流表中,进行摘除组件和标签的操作,本步操作同注销方法中的操作,不同之处是在摘除标签节点中的组件列表上的组件时,需要清空组件邮箱中的待摘除组件标签的邮件。
42.删除标签操作完成,返回实际删除标签的数量。
43.注意:当组件提交的需求是减少标签时,在处理摘除组件操作过程中,仅清空邮箱中与减少标签对应的邮件,不释放邮箱。
44.所述事件消息发送和处理流程如图7所示。
45.消息源组件发送事件消息,反射调用目标组件的事件处理方法来处理事件消息;消息源组件发送消息时,在事件消息发送流程中,需要提供的参数包括:标签、消息数据对象、组件自身引用和目标组件引用;其中目标组件应用可以设置为空(为null),如果不为空则表示明确指定目标组件,为空则为所有注册了该标签的组件分发事件。
46.数据总线先确认消息源组件是否已经注册,如果消息源组件没有注册,则返回-1,提醒未注册,提示消息源组件进行注册的流程。如果,消息源组件已经注册,通过消息源组件的标签在数据流表上得到该标签节点下的组件列表;如果消息源组件提供的参数中明确指定了目标组件,则消息源组件通过调用目标组件的事件处理方法分发事件,向目标组件分发消息;否则当目标组件参数为空时,消息源组件依次反射调用除自己外的组件的事件处理方法,为该标签下的所有组件分发事件,实现向组件列表中除消息源组件外的所有组件群发消息的功能,最后返回成功分发事件的数量。
47.接收到消息的目标组件在事件处理流程中,通过方法参数获得消息源组件的引用和事件消息,得到这些信息后就可以进行相应的处理;本发明技术方案中,为了避免阻塞数据总线,目标组件的事件方法内不能包括耗时代码。
48.本发明中通过事件消息发送和被动处理消息的设计,可以使事件处理方法成为获得其它组件引用的一个渠道。
49.所述邮箱消息发送和收取流程如图8所示。
50.组件发送邮件时,需要提供标签、消息数据对象、组件自身引用和目标组件引用参数;其中,目标组件引用可以为空(为null),即不明确指定目标组件,实现群发功能。目标组件可以是自己。
51.数据总线内,通过标签检查发送邮件的组件是否已经注册,如果没有注册则返回-1,提醒未注册,提示发送邮件的组件进行注册的流程。如果已经注册,则数据流表上找到使用邮件标签的组件列表;如果参数中明确指定了目标组件,则只向目标组件投放邮件;否则当目标组件为空时,向组件列表中除邮件发送组件外的所有组件的邮箱中投放邮件,最后返回成功投放邮件的数量。
52.邮件不会触发执行事件处理方法的执行,所以目标组件不会立刻知道邮件的到来,而是由各组件主动去收取邮件;收取邮件时,组件需要提供标签和组件自身引用参数,数据总线内部去组件邮箱中,根据标签取出标签标定的邮件返回给收取邮件的组件,取出邮件后将邮件从邮箱中删除。
53.具体实现时,收取邮件可以包括:按标签取和取该组件所有邮件。
54.按标签取实现的方法为:从邮箱中根据标签检索邮件,检索一个就从邮箱移除、放到返回链表中,返回邮件链表。
55.取组件所有邮件的方法为:将邮箱中所有邮件取出放到返回链表中、清空邮箱,返回邮件链表。
56.使用本发明的技术方案实现组件之间或者组件与后台线程之间通信,不但解耦了数据总线的驱动逻辑与事件消息实体类之间的关联,还降低了事件消息实体类与处理事件的方法的耦合度。此外,本发明还引入邮箱模型,提供更通用的数据通信功能,降低了应用程序的复杂度。本方法基于标签驱动的通信总线设计方法,以标签为线索进行数据的交换,在数据总线的实现上和使用上简单、灵活、高效。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献