CN106681847B - 基于Android***的消息处理方法及装置 - Google Patents
基于Android***的消息处理方法及装置 Download PDFInfo
- Publication number
- CN106681847B CN106681847B CN201611270184.9A CN201611270184A CN106681847B CN 106681847 B CN106681847 B CN 106681847B CN 201611270184 A CN201611270184 A CN 201611270184A CN 106681847 B CN106681847 B CN 106681847B
- Authority
- CN
- China
- Prior art keywords
- message
- type
- linked list
- node
- processed
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/546—Message passing systems or structures, e.g. queues
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/466—Transaction processing
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F2209/00—Indexing scheme relating to G06F9/00
- G06F2209/54—Indexing scheme relating to G06F9/54
- G06F2209/548—Queue
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Mobile Radio Communication Systems (AREA)
- Telephone Function (AREA)
Abstract
本发明公开了一种基于Android***的消息处理方法。本发明还公开了一种基于Android***的消息处理装置。本发明在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点,否则在所述链表中生成包含所述待处理消息的消息节点,从所述链表中取出消息进行处理,从而在一定程度上减少了需要处理的消息数量,降低了CPU的占有率,并提高了程序的响应速度,并且不影响通用的***平台应用的正常运行,更具普遍应用意义,而且实现简单,部署方便。
Description
技术领域
本发明涉及消息处理领域,尤其涉及一种基于Android***的消息处理方法及装置。
背景技术
随着目前Android产品推广,其友好用户体验,丰富的扩展应用,以及开源性质,都是Android***目前在智能设备市场占用率上的遥遥领先其他***的原因。
但是随着Android设备上安装的应用越来越多,手机响应速度就会下降。比如Android***的消息处理机制Handler在处理消息队列MessageQueue中的消息Message时,是循环逐一取出Message进行处理,然而某些消息在消息队列中可能存在多个,并且该消息是相对独立的,而该类消息的处理过程相对复杂且耗时,提高了CPU的占有率,并降低了程序响应速度。
上述内容仅用于辅助理解本发明的技术方案,并不代表承认上述内容是现有技术。
发明内容
本发明的主要目的在于提供一种基于Android***的消息处理方法及装置,旨在解决CPU的占有率较高,并程序响应速度较慢的技术问题。
为实现上述目的,本发明提供一种基于Android***的消息处理方法,所述方法包括以下步骤:
获取待处理消息;
在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息;
判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点;否则在所述链表中生成包含所述待处理消息的消息节点;
从所述链表中取出消息进行处理。
优选地,所述判断链表中是否存在属于所述消息类型的消息节点,具体包括:
根据所述消息类型查找类型记录表,当所述类型记录表中不存在所述消息类型时,将所述消息类型添加至所述类型记录表中,并认定所述链表中不存在属于所述消息类型的消息节点;当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点;
相应地,所述从所述链表中取出当前消息进行处理之后,所述方法还包括:
将取出的消息作为当前消息,判断所述当前消息是否为独立消息,若是,则删除所述类型记录表中与所述当前消息对应的信息。
优选地,所述当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点之后,所述方法还包括:
从所述类型记录表中查找与所述消息类型对应的当前节点序号,并根据所述当前节点序号获取所述链表中属于所述消息类型的消息节点;
相应地,所述在所述链表中生成包含所述待处理消息的消息节点之后,所述方法还包括:
将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中;
所述从所述链表中取出当前消息进行处理之后,所述方法还包括:
对所述类型记录表中的节点序号进行调整。
优选地,所述链表为单向链表;
相应地,所述在所述链表中生成包含所述待处理消息的消息节点,具体包括:
在所述链表的末尾生成包含所述待处理消息的消息节点。
优选地,所述通过所述待处理消息更新该消息节点,具体包括:
将该消息节点中包含的消息替换为所述待处理消息。
此外,为实现上述目的,本发明还提供一种基于Android***的消息处理装置,所述装置包括:
消息获取模块,用于获取待处理消息;
类型获取模块,用于在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息;
链表判断模块,用于判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点;否则在所述链表中生成包含所述待处理消息的消息节点;
消息处理模块,用于从所述链表中取出消息进行处理。
优选地,所述链表判断模块,还用于根据所述消息类型查找类型记录表,当所述类型记录表中不存在所述消息类型时,将所述消息类型添加至所述类型记录表中,并认定所述链表中不存在属于所述消息类型的消息节点;当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点;
相应地,所述装置还包括:
信息删除模块,用于将取出的消息作为当前消息,判断所述当前消息是否为独立消息,若是,则删除所述类型记录表中与所述当前消息对应的信息。
优选地,所述链表判断模块,还用于从所述类型记录表中查找与所述消息类型对应的当前节点序号,并根据所述当前节点序号获取所述链表中属于所述消息类型的消息节点;
相应地,所述链表判断模块,还用于将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中;
所述装置还包括:
序号调整模块,用于对所述类型记录表中的节点序号进行调整。
优选地,所述链表为单向链表;
相应地,所述链表判断模块,还用于在所述链表的末尾生成包含所述待处理消息的消息节点。
优选地,所述链表判断模块,还用于将该消息节点中包含的消息替换为所述待处理消息。
本发明在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点,否则将所述待处理消息添加至所述链表中,从所述链表中取出消息进行处理,从而在一定程度上减少了需要处理的消息数量,降低了CPU的占有率,并提高了程序的响应速度,并且不影响通用的***平台应用的正常运行,更具普遍应用意义,而且实现简单,部署方便。
附图说明
图1为本发明基于Android***的消息处理方法第一实施例的流程示意图;
图2为本发明基于Android***的消息处理方法第二实施例的流程示意图;
图3为本发明基于Android***的消息处理方法第三实施例的流程示意图;
图4为本发明基于Android***的消息处理方法第四实施例的流程示意图;
图5为本发明基于Android***的消息处理装置第一实施例的功能模块示意图;
图6为本发明基于Android***的消息处理装置第二实施例的功能模块示意图;
图7为本发明基于Android***的消息处理装置第三实施例的功能模块示意图;
图8为本发明基于Android***的消息处理装置第四实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
参照图1,本发明第一实施例提供一种基于Android***的消息处理方法,所述方法包括:
S10:获取待处理消息;
需要说明的是,本实施例的方法的执行主体为安装有Android***的终端设备,所述终端设备可以为智能电视、智能手机、平板电脑、智能手表、笔记本电脑或掌上电脑等设备,本实施例对此不加以限制。
可理解的是,所述待处理消息即为需要处理的消息,现有技术中,对于Android***的消息处理机制Handler在处理消息队列MessageQueue中的消息Message时,是循环逐一取出Message进行处理,相应地,本实施例中,可从所述消息队列MessageQueue中依次取出消息Message,并将从所述消息队列MessageQueue中取出的消息Message作为待处理消息。
S20:在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息;
在具体实现中,可预先在Message类中添加独立消息boolean mIndepend变量,当handler发送消息时,如果是独立消息,可将该变量置为true(默认mIndependent=false),因此,可通过判断Message类中变量mIndependent来确定所述待处理消息是否为独立消息。
在确定所述待处理消息是否为独立消息时,可定义一个函数booleanisIndependentMsg(Message msg),其功能为判断待处理消息msg是否为独立消息,即判断Message类中变量mIndependent,该函数的返回值为:是独立消息则返回true,否则返回false。
可理解的是,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息,当然,其存在多种消息类型,始终是相同消息类型的最后一条消息起作用,而存在该消息队列中其他位置的相同消息类型的消息可被忽略。比如UI进度条绘制,如果消息队列中存在30个绘制消息,分别是index=1,2,...30对应的进度条,最终体现且起作用的是index=30,那么完全可以忽略index=1,2,3...29,直接绘制index=30的进度条。
需要说明的是,在所述待处理消息不是独立消息时,由于其会对其他进行造成影响,因此,无需对该待处理消息的消息类型进行判断,直接将所述待处理消息添加至所述链表中。
S30:判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点;否则在所述链表中生成包含所述待处理消息的消息节点;
需要说明的是,所述链表在使用前通常需要进行初始化,故而,本实施例中,可定义一个函数MyLinkList initLinkList(),其功能为初始化链表(所述链表用于保存重新排序的节点),该函数的作用是返回链表。
可理解的是,在判断链表中是否存在属于所述消息类型的消息节点时,可定义一个函数int hasThisTypeMsg(int msgWhat,MyLinkList mylinklist),其功能为查询链表mylinklist中是否含有消息类型为msgWhat的消息节点,涉及的参数msgWhat为所述待处理消息msg的消息类型,参数mylinklist为所述链表,该函数的返回值为:存在msgWhat消息类型的消息节点,则返回在链表中的位置;否则返回-1。
在具体实现中,由于相同消息类型的最后一条消息起作用,而存在该消息队列中其他位置的相同消息类型的消息可被忽略,故而,在所述链表中存在属于所述消息类型的消息节点时,可通过所述待处理消息更新该消息节点,而在所述链表中不存在属于所述消息类型的消息节点时,可在所述链表中生成包含所述待处理消息的消息节点。
所述通过所述待处理消息更新该消息节点,具体包括:将该消息节点中包含的消息替换为所述待处理消息。
为便于忽略相同消息类型的消息,本实施例中,在链表中存在属于所述消息类型的消息节点时,可将所述该消息节点中包含的消息替换为所述待处理消息。
在具体实现中,可定义一个函数boolean replaceNode(Message msg,MyLinkListmylinklist,int index),其功能为替换链表mylinklist中的第index个节点为待处理消息msg,涉及的参数msg为待处理消息,mylinklist为链表,index为替换链表中的位置,该函数的返回值为:成功则返回true,否则返回false。
S40:从所述链表中取出消息进行处理。
可理解的是,本实施例保留了handler的消息发送、消息处理顺序及处理流程,其尽量保留了Handler_Looper_Msg原生的处理逻辑,但对Looper的获取消息机制进行了调整,也就是说,对消息队列中的消息逐一取出存入链表mylinklist,然后从链表mylinklist取出进行处理。
本实施例在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点,否则将所述待处理消息添加至所述链表中,从所述链表中取出消息进行处理,从而在一定程度上减少了需要处理的消息数量,降低了CPU的占有率,并提高了程序的响应速度,并且不影响通用的***平台应用的正常运行,更具普遍应用意义,而且实现简单,部署方便。
参照图2,图2为本发明基于Android***的消息处理方法第二实施例的流程示意图,基于上述图1所示的实施例,提出本发明基于Android***的消息处理方法的第二实施例。
本实施例中,步骤S30’中,判断链表中是否存在属于所述消息类型的消息节点,具体包括:
根据所述消息类型查找类型记录表,当所述类型记录表中不存在所述消息类型时,将所述消息类型添加至所述类型记录表中,并认定所述链表中不存在属于所述消息类型的消息节点;当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点;
相应地,所述步骤S40之后,所述方法还包括:
S50:将取出的消息作为当前消息,判断所述当前消息是否为独立消息,若是,则删除所述类型记录表中与所述当前消息对应的信息。
需要说明的是,判断链表中是否存在属于所述消息类型的消息节点时,较为常用的方式是将所述链表进行遍历,并将遍历到的消息节点与所述消息类型进行比对,但有时可能在链表中并不存在所述消息类型的情况下,仍然需要对链表进行遍历,也就是说,浪费了遍历链表的时间,进行了无意义地处理,使得效率降低。
为避免上述问题,本实施例中,可维护一个类型记录表,在判断所述链表中是否存在属于所述消息类型的消息节点时,可直接查找类型记录表,在所述类型记录表中不存在所述消息类型时,直接将所述消息类型添加至所述类型记录表中,这样下次获取的待处理消息仍然是相同消息类型的消息的情况下,即可理解为类型记录表中存在所述消息类型;在所述类型记录表中存在所述消息类型时,即可认定所述链表中存在属于所述消息类型的消息节点。
当然,为了保证所述类型记录表的即时性,当从链表中取出当前消息进行处理时,即可判断取出的消息是否为独立消息,若是,则删除所述类型记录表中与该消息对应的信息,即将所述类型记录表中与该消息对应的消息类型删除。
参照图3,图3为本发明基于Android***的消息处理方法第三实施例的流程示意图,基于上述图2所示的实施例,提出本发明基于Android***的消息处理方法的第三实施例。
本实施例中,步骤S30”中,当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点之后,所述方法还包括:
从所述类型记录表中查找与所述消息类型对应的当前节点序号,并根据所述当前节点序号获取所述链表中属于所述消息类型的消息节点;
相应地,步骤S30”中,在所述链表中生成包含所述待处理消息的消息节点之后,所述方法还包括:
将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中;
所述步骤S40之后,所述方法还包括:
S60:对所述类型记录表中的节点序号进行调整。
可理解的是,为便于获取所述链表中属于所述消息类型的消息节点,可在所述节点链表中添加与消息类型对应的节点序号。
当然,为了便于在类型记录表中添加所述节点序号,本实施例中,在所述链表中生成包含所述待处理消息的消息节点之后,将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中。
当然,为了保证所述类型记录表中节点序号的即时性,当从链表中取出当前消息进行处理时,对所述类型记录表中的节点序号进行调整,以保证所述类型记录表中的节点序号为最新。
参照图4,图4为本发明基于Android***的消息处理方法第四实施例的流程示意图,基于上述图1~3中任一项所示的实施例,提出本发明基于Android***的消息处理方法的第四实施例,图4以基于图1所示的实施例为例。
本实施例中,所述链表为单向链表;
相应地,步骤S30”’中,在所述链表中生成包含所述待处理消息的消息节点,具体包括:
在所述链表的末尾生成包含所述待处理消息的消息节点。
在具体实现中,可定义一个函数boolean addNode(Message msg,MyLinkListmylinklist),其功能为将新节点(即包含所述待处理消息msg的节点)增加至链表mylinklist的末尾,涉及的参数msg为待处理消息,mylinklist为链表,该函数的返回值为:成功则返回true,否则返回false。
为便于保证消息的处理顺序,本实施例中,所述链表采用单向链表,因此,相应地,S40中会从所述链表中依次取出消息进行处理,在具体实现中,可定义一个函数Messagemsg getMsg(int index,MyLinkList mylinklist),其功能为取出链表mylinklist中的第index个节点msg,涉及的参数index为要提取节点的位置,参数mylinklist为链表,该函数的返回值为返回与index对应的消息。
假设消息队列queue中消息原本的排列为:(设消息类型相同x1=x2=...=xn)
消息4 | 独立消息b2 | 消息3 | 独立消息a2 | 独立消息b1 | 消息2 | 独立消息a1 | 消息1 |
链表mylinklist中消息的排列为:
消息4 | 消息3 | 独立消息b2 | 消息2 | 独立消息a2 | 消息1 |
可以看到,链表中的消息比消息队列中的消息少了2条,且因为这2条消息是独立消息,因此真正起作用的是处于消息队列中最后的一条消息。
假设消息队列中如果存在大量的独立消息,那本实施例的方法的优点就会充分发挥,比如Android 6.0,在现有技术中,当用户按下音量+键,AudioService会利用hanlder发送音量消息,SystemUi收到消息后进行绘制,因为该消息是独立的,如果用户连续按下按键,当松开按键后,会发现UI会持续1-2s才会停止,原因是消息队列queue中消息较多,handler处理不及时导致,但是如果使用本实施例的方法,因为该消息是独立消息,当用户停止按键后,UI立刻响应最后一条消息,并且在用户停止按键后UI不会继续变化,达到按键停,消息处理完的效果。
参照图5,本发明第一实施例提供一种基于Android***的消息处理装置,所述装置包括:
消息获取模块10,用于获取待处理消息;
需要说明的是,本实施例的装置部署于安装有Android***的终端设备上,所述终端设备可以为智能电视、智能手机、平板电脑、智能手表、笔记本电脑或掌上电脑等设备,本实施例对此不加以限制。
可理解的是,所述待处理消息即为需要处理的消息,现有技术中,对于Android***的消息处理机制Handler在处理消息队列MessageQueue中的消息Message时,是循环逐一取出Message进行处理,相应地,本实施例中,可从所述消息队列MessageQueue中依次取出消息Message,并将从所述消息队列MessageQueue中取出的消息Message作为待处理消息。
类型获取模块20,用于在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息;
在具体实现中,可预先在Message类中添加独立消息boolean mIndepend变量,当handler发送消息时,如果是独立消息,可将该变量置为true(默认mIndependent=false),因此,可通过判断Message类中变量mIndependent来确定所述待处理消息是否为独立消息。
在确定所述待处理消息是否为独立消息时,可定义一个函数booleanisIndependentMsg(Message msg),其功能为判断待处理消息msg是否为独立消息,即判断Message类中变量mIndependent,该函数的返回值为:是独立消息则返回true,否则返回false。
可理解的是,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息,当然,其存在多种消息类型,始终是相同消息类型的最后一条消息起作用,而存在该消息队列中其他位置的相同消息类型的消息可被忽略。比如UI进度条绘制,如果消息队列中存在30个绘制消息,分别是index=1,2,...30对应的进度条,最终体现且起作用的是index=30,那么完全可以忽略index=1,2,3...29,直接绘制index=30的进度条。
需要说明的是,在所述待处理消息不是独立消息时,由于其会对其他进行造成影响,因此,无需对该待处理消息的消息类型进行判断,直接将所述待处理消息添加至所述链表中,也就是说,所述装置还可包括:消息添加模块,用于在所述待处理消息不是独立消息时,将所述待处理消息添加至所述链表中。
链表判断模块30,用于判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点;否则在所述链表中生成包含所述待处理消息的消息节点;
需要说明的是,所述链表在使用前通常需要进行初始化,故而,本实施例中,可定义一个函数MyLinkList initLinkList(),其功能为初始化链表(所述链表用于保存重新排序的节点),该函数的作用是返回链表。
可理解的是,在判断链表中是否存在属于所述消息类型的消息节点时,可定义一个函数int hasThisTypeMsg(int msgWhat,MyLinkList mylinklist),其功能为查询链表mylinklist中是否含有消息类型为msgWhat的消息节点,涉及的参数msgWhat为所述待处理消息msg的消息类型,参数mylinklist为所述链表,该函数的返回值为:存在msgWhat消息类型的消息节点,则返回在链表中的位置;否则返回-1。
在具体实现中,由于相同消息类型的最后一条消息起作用,而存在该消息队列中其他位置的相同消息类型的消息可被忽略,故而,在所述链表中存在属于所述消息类型的消息节点时,可通过所述待处理消息更新该消息节点,而在所述链表中不存在属于所述消息类型的消息节点时,可在所述链表中生成包含所述待处理消息的消息节点。
所述通过所述待处理消息更新该消息节点,具体包括:将该消息节点中包含的消息替换为所述待处理消息。
为便于忽略相同消息类型的消息,本实施例中,在链表中存在属于所述消息类型的消息节点时,可将所述该消息节点中包含的消息替换为所述待处理消息。
在具体实现中,可定义一个函数boolean replaceNode(Message msg,MyLinkListmylinklist,int index),其功能为替换链表mylinklist中的第index个节点为待处理消息msg,涉及的参数msg为待处理消息,mylinklist为链表,index为替换链表中的位置,该函数的返回值为:成功则返回true,否则返回false。
消息处理模块40,用于从所述链表中取出消息进行处理。
可理解的是,本实施例保留了handler的消息发送、消息处理顺序及处理流程,其尽量保留了Handler_Looper_Msg原生的处理逻辑,但对Looper的获取消息机制进行了调整,也就是说,对消息队列中的消息逐一取出存入链表mylinklist,然后从链表mylinklist取出进行处理。
本实施例在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,判断链表中是否存在属于所述消息类型的消息节点,若是,则通过所述待处理消息更新该消息节点,否则将所述待处理消息添加至所述链表中,从所述链表中取出消息进行处理,从而在一定程度上减少了需要处理的消息数量,降低了CPU的占有率,并提高了程序的响应速度,并且不影响通用的***平台应用的正常运行,更具普遍应用意义,而且实现简单,部署方便。
参照图6,图6为本发明基于Android***的消息处理装置第二实施例的功能模块示意图,基于上述图5所示的实施例,提出本发明基于Android***的消息处理装置的第二实施例。
本实施例中,所述链表判断模块30’,还用于根据所述消息类型查找类型记录表,当所述类型记录表中不存在所述消息类型时,将所述消息类型添加至所述类型记录表中,并认定所述链表中不存在属于所述消息类型的消息节点;当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点;
相应地,所述装置还包括:
信息删除模块50,用于将取出的消息作为当前消息,判断所述当前消息是否为独立消息,若是,则删除所述类型记录表中与所述当前消息对应的信息。
需要说明的是,判断链表中是否存在属于所述消息类型的消息节点时,较为常用的方式是将所述链表进行遍历,并将遍历到的消息节点与所述消息类型进行比对,但有时可能在链表中并不存在所述消息类型的情况下,仍然需要对链表进行遍历,也就是说,浪费了遍历链表的时间,进行了无意义地处理,使得效率降低。
为避免上述问题,本实施例中,可维护一个类型记录表,在判断所述链表中是否存在属于所述消息类型的消息节点时,可直接查找类型记录表,在所述类型记录表中不存在所述消息类型时,直接将所述消息类型添加至所述类型记录表中,这样下次获取的待处理消息仍然是相同消息类型的消息的情况下,即可理解为类型记录表中存在所述消息类型;在所述类型记录表中存在所述消息类型时,即可认定所述链表中存在属于所述消息类型的消息节点。
当然,为了保证所述类型记录表的即时性,当从链表中取出当前消息进行处理时,即可判断取出的消息是否为独立消息,若是,则删除所述类型记录表中与该消息对应的信息,即将所述类型记录表中与该消息对应的消息类型删除。
参照图7,图7为本发明基于Android***的消息处理装置第三实施例的功能模块示意图,基于上述图6所示的实施例,提出本发明基于Android***的消息处理装置的第三实施例。
本实施例中,所述链表判断模块S30”,还用于从所述类型记录表中查找与所述消息类型对应的当前节点序号,并根据所述当前节点序号获取所述链表中属于所述消息类型的消息节点;
相应地,所述链表判断模块S30”,还用于将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中;
所述装置还包括:
序号调整模块60,用于对所述类型记录表中的节点序号进行调整。
可理解的是,为便于获取所述链表中属于所述消息类型的消息节点,可在所述节点链表中添加与消息类型对应的节点序号。
当然,为了便于在类型记录表中添加所述节点序号,本实施例中,在所述链表中生成包含所述待处理消息的消息节点之后,将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中。
当然,为了保证所述类型记录表中节点序号的即时性,当从链表中取出当前消息进行处理时,对所述类型记录表中的节点序号进行调整,以保证所述类型记录表中的节点序号为最新。
参照图8,图8为本发明基于Android***的消息处理装置第四实施例的功能模块示意图,基于上述图5~7中任一项所示的实施例,提出本发明基于Android***的消息处理装置的第四实施例。
本实施例中,所述链表为单向链表;
相应地,所述链表判断模块30”’,还用于在所述链表的末尾生成包含所述待处理消息的消息节点。
在具体实现中,可定义一个函数boolean addNode(Message msg,MyLinkListmylinklist),其功能为将新节点(即包含所述待处理消息msg的节点)增加至链表mylinklist的末尾,涉及的参数msg为待处理消息,mylinklist为链表,该函数的返回值为:成功则返回true,否则返回false。
为便于保证消息的处理顺序,本实施例中,所述链表采用单向链表,因此,相应地,S40中会从所述链表中依次取出消息进行处理,在具体实现中,可定义一个函数Messagemsg getMsg(int index,MyLinkList mylinklist),其功能为取出链表mylinklist中的第index个节点msg,涉及的参数index为要提取节点的位置,参数mylinklist为链表,该函数的返回值为返回与index对应的消息。
假设消息队列queue中消息原本的排列为:(设消息类型相同x1=x2=...=xn)
消息4 | 独立消息b2 | 消息3 | 独立消息a2 | 独立消息b1 | 消息2 | 独立消息a1 | 消息1 |
链表mylinklist中消息的排列为:
消息4 | 消息3 | 独立消息b2 | 消息2 | 独立消息a2 | 消息1 |
可以看到,链表中的消息比消息队列中的消息少了2条,且因为这2条消息是独立消息,因此真正起作用的是处于消息队列中最后的一条消息。
假设消息队列中如果存在大量的独立消息,那本实施例的方法的优点就会充分发挥,比如Android 6.0,在现有技术中,当用户按下音量+键,AudioService会利用hanlder发送音量消息,SystemUi收到消息后进行绘制,因为该消息是独立的,如果用户连续按下按键,当松开按键后,会发现UI会持续1-2s才会停止,原因是消息队列queue中消息较多,handler处理不及时导致,但是如果使用本实施例的方法,因为该消息是独立消息,当用户停止按键后,UI立刻响应最后一条消息,并且在用户停止按键后UI不会继续变化,达到按键停,消息处理完的效果。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者***不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者***所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者***中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空调器,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (8)
1.一种基于Android***的消息处理方法,其特征在于,所述方法包括以下步骤:
获取待处理消息;
在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息;
根据所述消息类型查找类型记录表,当所述类型记录表中不存在所述消息类型时,将所述消息类型添加至所述类型记录表中,并认定链表中不存在属于所述消息类型的消息节点;当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点,通过所述待处理消息更新该消息节点;
从所述链表中取出消息进行处理;
将取出的消息作为当前消息,判断所述当前消息是否为独立消息,若是,则删除所述类型记录表中与所述当前消息对应的信息。
2.如权利要求1所述的方法,其特征在于,所述当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点之后,所述方法还包括:
从所述类型记录表中查找与所述消息类型对应的当前节点序号,并根据所述当前节点序号获取所述链表中属于所述消息类型的消息节点;
相应地,所述在所述链表中生成包含所述待处理消息的消息节点之后,所述方法还包括:
将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中;
所述从所述链表中取出当前消息进行处理之后,所述方法还包括:
对所述类型记录表中的节点序号进行调整。
3.如权利要求1~2中任一项所述的方法,其特征在于,所述链表为单向链表;
相应地,所述在所述链表中生成包含所述待处理消息的消息节点,具体包括:
在所述链表的末尾生成包含所述待处理消息的消息节点。
4.如权利要求1~2中任一项所述的方法,其特征在于,所述通过所述待处理消息更新该消息节点,具体包括:
将该消息节点中包含的消息替换为所述待处理消息。
5.一种基于Android***的消息处理装置,其特征在于,所述装置包括:
消息获取模块,用于获取待处理消息;
类型获取模块,用于在所述待处理消息是独立消息时,获取所述待处理消息的消息类型,所述独立消息为进行处理时,不会对Android***中其他进程造成影响的消息;
链表判断模块,用于根据所述消息类型查找类型记录表,当所述类型记录表中不存在所述消息类型时,将所述消息类型添加至所述类型记录表中,并认定链表中不存在属于所述消息类型的消息节点;当所述类型记录表中存在所述消息类型时,认定所述链表中存在属于所述消息类型的消息节点,通过所述待处理消息更新该消息节点;
消息处理模块,用于从所述链表中取出消息进行处理;
信息删除模块,用于将取出的消息作为当前消息,判断所述当前消息是否为独立消息,若是,则删除所述类型记录表中与所述当前消息对应的信息。
6.如权利要求5所述的装置,其特征在于,所述链表判断模块,还用于从所述类型记录表中查找与所述消息类型对应的当前节点序号,并根据所述当前节点序号获取所述链表中属于所述消息类型的消息节点;
相应地,所述链表判断模块,还用于将所述消息类型及生成的消息节点的节点序号添加至所述类型记录表中;
所述装置还包括:
序号调整模块,用于对所述类型记录表中的节点序号进行调整。
7.如权利要求5~6中任一项所述的装置,其特征在于,所述链表为单向链表;
相应地,所述链表判断模块,还用于在所述链表的末尾生成包含所述待处理消息的消息节点。
8.如权利要求5~6中任一项所述的装置,其特征在于,所述链表判断模块,还用于将该消息节点中包含的消息替换为所述待处理消息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611270184.9A CN106681847B (zh) | 2016-12-30 | 2016-12-30 | 基于Android***的消息处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611270184.9A CN106681847B (zh) | 2016-12-30 | 2016-12-30 | 基于Android***的消息处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106681847A CN106681847A (zh) | 2017-05-17 |
CN106681847B true CN106681847B (zh) | 2020-08-11 |
Family
ID=58849743
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611270184.9A Active CN106681847B (zh) | 2016-12-30 | 2016-12-30 | 基于Android***的消息处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106681847B (zh) |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1859325A (zh) * | 2006-02-14 | 2006-11-08 | 华为技术有限公司 | 基于链表的进程间消息传递方法 |
CN101470636A (zh) * | 2007-12-27 | 2009-07-01 | 北京东方通科技发展有限责任公司 | 一种消息的读写方法和装置 |
CN102395958A (zh) * | 2011-08-26 | 2012-03-28 | 华为技术有限公司 | 一种数据包的并发处理方法及设备 |
CN102880507A (zh) * | 2012-09-12 | 2013-01-16 | 科立讯通信股份有限公司 | 一种链式结构消息申请及分发的方法 |
CN103543988A (zh) * | 2013-10-23 | 2014-01-29 | 华为终端有限公司 | 队列消息的处理方法、控制消息进入队列的方法及装置 |
CN104620224A (zh) * | 2012-09-13 | 2015-05-13 | 汤姆逊许可公司 | 从先进先出传送机构的随机存取消息检索的方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9311011B2 (en) * | 2013-08-07 | 2016-04-12 | Qualcomm Incorporated | Dynamic address negotiation for shared memory regions in heterogenous multiprocessor systems |
-
2016
- 2016-12-30 CN CN201611270184.9A patent/CN106681847B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1859325A (zh) * | 2006-02-14 | 2006-11-08 | 华为技术有限公司 | 基于链表的进程间消息传递方法 |
CN101470636A (zh) * | 2007-12-27 | 2009-07-01 | 北京东方通科技发展有限责任公司 | 一种消息的读写方法和装置 |
CN102395958A (zh) * | 2011-08-26 | 2012-03-28 | 华为技术有限公司 | 一种数据包的并发处理方法及设备 |
CN102880507A (zh) * | 2012-09-12 | 2013-01-16 | 科立讯通信股份有限公司 | 一种链式结构消息申请及分发的方法 |
CN104620224A (zh) * | 2012-09-13 | 2015-05-13 | 汤姆逊许可公司 | 从先进先出传送机构的随机存取消息检索的方法 |
CN103543988A (zh) * | 2013-10-23 | 2014-01-29 | 华为终端有限公司 | 队列消息的处理方法、控制消息进入队列的方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN106681847A (zh) | 2017-05-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108074177B (zh) | 数据对账方法、***和计算机可读存储介质 | |
JP5496113B2 (ja) | Omadmプロトコルを用いて目標を絞り込むクエリー | |
US10652037B2 (en) | Notifying affected users of feature changes in a software application | |
US10051552B2 (en) | Method for realizing resource attribute notification, and common service entity | |
CN109271157B (zh) | 软件开发方法、设备及计算机可读存储介质 | |
CN106604109B (zh) | 智能电视的配置方法及装置 | |
CN111274263A (zh) | 可视化数据库变更语句生成方法、装置及存储介质 | |
CN111782728B (zh) | 一种数据同步方法、装置、电子设备及介质 | |
CN109003012B (zh) | 货位推荐链路信息获取方法、货位推荐方法、装置及*** | |
KR20210008525A (ko) | 가입 서버, 가입 단말기, 정보 가입 방법, 및 시스템 | |
CN113779051A (zh) | 词库更新方法和装置、风险控制方法、装置和*** | |
CN112988280B (zh) | 一种配置数据处理方法及装置 | |
CN110929133A (zh) | 运维信息查询***及方法 | |
CN106681847B (zh) | 基于Android***的消息处理方法及装置 | |
CN108509188B (zh) | 一种列表的建立方法、装置及电子设备 | |
CN111125205B (zh) | 看板数据显示方法、终端及存储介质 | |
CN103647843A (zh) | 触发和响应云输入请求的方法和设备 | |
CN113761565B (zh) | 数据脱敏方法和装置 | |
CN110427538B (zh) | 一种数据查询方法、存储方法、装置及电子设备 | |
CN110955460B (zh) | 一种服务进程启动方法、装置、电子设备和存储介质 | |
CN109710436B (zh) | 空间清理方法、装置、设备和计算机可读存储介质 | |
CN111090651A (zh) | 数据源的处理方法、装置、设备及可读存储介质 | |
CN112015432A (zh) | 一种静态项目部署方法及装置 | |
CN110706035A (zh) | 一种更新效果的评价方法、装置、存储介质及电子设备 | |
CN106372121B (zh) | 服务器及数据处理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |