CN108874494A - 一种Android系统中的消息处理方法及Android电子设备 - Google Patents
一种Android系统中的消息处理方法及Android电子设备 Download PDFInfo
- Publication number
- CN108874494A CN108874494A CN201810657259.1A CN201810657259A CN108874494A CN 108874494 A CN108874494 A CN 108874494A CN 201810657259 A CN201810657259 A CN 201810657259A CN 108874494 A CN108874494 A CN 108874494A
- Authority
- CN
- China
- Prior art keywords
- message
- mmessage
- certain
- types
- android system
- 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.)
- Pending
Links
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/44—Arrangements for executing specific programs
- G06F9/451—Execution arrangements for user interfaces
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Human Computer Interaction (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Telephone Function (AREA)
Abstract
本公开提供了一种Android系统中的消息处理方法及Android电子设备,方法包括:对消息总线中的消息进行筛选,获取特定消息类型的消息;采用Android系统中的Message.obtain()方法获取特定消息类型的消息,得到一个mMessage对象,其中,mMessage对象包括该消息的消息内容及消息ID;采用Android系统中的mHandler.sendMessage()方法,将mMessage对象发送到主线程中;在主线程中判定mMessage对象中消息ID是否合法,如果是,则获取mMessage对象中的消息内容。本公开能够能够在需要更新UI时,自动将子线程的消息转化为主线程消息,这样,系统在接收到消息后无需判定消息的线程问题进而直接进行UI更新,提高了消息的处理效率和降低了线程判定的冗余逻辑。
Description
技术领域
本公开属于计算机软件领域,具体涉及一种Android系统中的消息处理方法及Android电子设备。
背景技术
在Android开发过程中,常需要更新用户界面(User Interface,UI)。而更新UI是要主线程来更新的,即UI线程更新。如果在主线线程之外的线程中直接更新页面显示常会报错。
然而,系统在接收到用于更新UI的消息时,并不清楚其是子线程中的消息还是主线程中的消息。因此在接收到消息后需要判定消息的线程,如果是子线程,还需要将消息转发到主线程才能更新UI操作,以上对消息的线程判定和自己转换线程的过程会耗费很多的资源开销且存在很多冗余代码。
发明内容
本公开鉴于上述问题,提供一种Android系统中的消息处理方法及Android电子设备,能够在需要更新UI时,自动将子线程的消息转化为主线程消息,这样,系统在接收到消息后无需判定消息的线程问题进而直接进行UI更新,提高了消息的处理效率和降低了线程判定的冗余逻辑。
本公开的一个方面提供了一种Android系统中的消息处理方法,包括:对消息总线中的消息进行筛选,获取特定消息类型的消息;采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID;采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中;在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
可选地,所述对消息总线中的消息进行筛选,获取特定消息类型的消息,包括:为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型;根据每个消息的Bean结构,对消息总线中的消息进行筛选,得到特定消息类型的消息。
可选地,所述对消息总线中的消息进行筛选,获取特定消息类型的消息,还包括:将得到特定消息类型的消息发送至onEvent()函数,该onEvent()函数中的参数类型为所述特定消息类型的消息。
可选地,所述在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容,包括:将所述mMessage对象中消息ID与全局中的消息ID进行对比,若一致,则所述mMessage对象中消息ID合法,否则所述mMessage对象中消息ID不合法。
可选地,方法还包括:所述主线程采用所述消息内容对用户界面进行更新。
可选地,所述消息ID为MSG_ID_XXX,其中,XXX为所述Bean结构的名称。
可选地,采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中,包括:将所述mMessage对象作为参数值,并执行mHandler.sendMessage(mMessage),以将mMessage对象发送至主线程中。
本公开的另一个方面提供了一种Android电子设备,包括:处理器;存储器,其存储有计算机可执行程序,该程序在被所述处理器执行时,使得所述处理器执行:对消息总线中的消息进行筛选,获取特定消息类型的消息;采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID;采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中;在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
可选地,所述处理器对消息总线中的消息进行筛选,获取特定消息类型的消息,包括:为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型;根据每个消息的Bean结构,对消息总线中的消息进行筛选,得到特定消息类型的消息。
可选地,所述处理器对消息总线中的消息进行筛选,获取特定消息类型的消息,还包括:将得到特定消息类型的消息发送至onEvent()函数,该onEvent()函数中的参数类型为所述特定消息类型的消息。
可选地,所述处理器在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容,包括:将所述mMessage对象中消息ID与全局中的消息ID进行对比,若一致,则所述mMessage对象中消息ID合法,否则所述mMessage对象中消息ID不合法。
可选地,所述处理器还执行:采用所述消息内容对用户界面进行更新。
附图说明
为了更完整地理解本公开及其优势,现在将参考结合附图的以下描述,其中:
图1示意性示出了本公开实施例提供的Android系统中的消息处理方法的流程图。
图2示意性示出了根据本公开的Android电子设备的框图。
图3示意性示出了本公开实施例提供的Android系统中的消息处理装置的流程图。
具体实施方式
根据结合附图对本公开示例性实施例的以下详细描述,本公开的其它方面、优势和突出特征对于本领域技术人员将变得显而易见。
在本公开中,术语“包括”和“含有”及其派生词意为包括而非限制;术语“或”是包含性的,意为和/或。
在本说明书中,下述用于描述本公开原理的各种实施例只是说明,不应该以任何方式解释为限制公开的范围。参照附图的下述描述用于帮助全面理解由权利要求及其等同物限定的本公开的示例性实施例。下述描述包括多种具体细节来帮助理解,但这些细节应认为仅仅是示例性的。因此,本领域普通技术人员应认识到,在不背离本公开的范围和精神的情况下,可以对本文中描述的实施例进行多种改变和修改。此外,为了清楚和简洁起见,省略了公知功能和结构的描述。此外,贯穿附图,相同参考数字用于相似功能和操作。
图1示意性示出了本公开实施例提供的Android系统中的消息处理方法的流程图。
如图1所示,方法包括如下操作:
S1,对消息总线中的消息进行筛选,获取特定消息类型的消息。
在上述操作S1中,实现了对特定消息类型的消息的接收,其中,该特定消息类型的消息为用于进行UI更新的消息。具体地,本公开实施例为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型,其中,每个消息都有唯一的消息数据Bean结构。
接着,本公开实施例定义一个用于接收特定类型消息的函数onEvent:
public void onEvent(MyBean mMyBean);
其中,onEvent()函数中的参数MyBean为一个特定类型消息的Bean结构(该Bean结构为MyBean)。
当每个消息通过消息总线时,消息总线自动对根据每个消息的Bean结构,对子线程的消息进行筛选,找到符合onEvent()函数中参数类型的消息,作为特定消息类型的消息,并将该消息分发到对应的onEvent()函数中。
同理,本公开若需要获取其他类型的消息,只需要修改onEvent()函数中的参数即可。
通过操作S1可以看出,本公开实施例通过一个自定义的onEvent()函数来匹配出特定消息类型的消息,相比于现有技术中通过监听器进行消息监听流程(需要注册监听流程和反注册监听流程),提高了获取消息的便捷性。
S2,采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID。
在操作S1中接收到特定类型的消息后,若消息是在子线程中,则该子线程无法根据该消息进行UI更新操作,如果需要进行UI更新操作,需要将该消息转发到主线程中。在上述操作S2中,实现了将消息转发到主线程之前进行数据封装的过程。
具体地,定义一个Handler对象,Handler对象是Android系统中提供的一个消息通信机制。定义Handler的方法是通过调用Handler mHandler=new Handler()的方法来构建一个mHandler对象。
另外,为了对消息进行转发,本公开实施例定义一个全局的消息ID。针对上述的具有MyBean结构的消息,其对应的全局的消息ID为:MSG_ID_MY_BEAN=”msg_id_my_bean”,其类型为public static final String,该消息id是一个常量其值后续不可再更改。由上述可知,消息ID的定义是具有一定的规则的,所有消息ID的修饰符是public static finalString类型,其消息ID的名称规则是MSG_ID_XXX(XXX表示具体的消息名称),其消息id的值是MSG_ID_XXX的全小写字母。这种规则能够确保消息的唯一性的同时能够快速的对消息进行分辨,提高消息的可辨识性。
接着,通过Message对象中的Message.obtain()方法来获取一个消息,本公开实施例之所以用Message.obtain()方法来获取一个消息,其优势在于能够对消息进行复用,提高消息获取的速度。现有技术中通过Message的构造函数通过Message msg=new Message()的方式来构造Msg,这种方式构造msg的开销会非常大,降低了消息构造的效率,而且无法对消息进行复用处理。将Message.obtain()方法获取到的Message标记为mMessage,然后通过对mMessage.what=MSG_ID_MY_BEAN和mMessage.obj=MyBean方式,来对获取到的mMessage进行赋值操作。其中mMessage.what=MSG_ID_MY_BEAN表示,对消息设置一个唯一的消息ID并将该ID信息封装到消息的what参数中。mMessage.obj=MyBean表示,将消息对象封装到消息的obj对象中。通过以上操作,使得mMessage对象包含有消息ID和消息的内容信息。
S3,采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中。
在上述操作S3中,mHandler.sendMessage()为系统自带的方法,用于对mMessage对象进行发送。通过将mMessage对象作为参数值,并执行mHandler.sendMessage(mMessage),实现了将封装好了mMessage对象发送至主线程中。
S4,在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
在上述操作S4中,实现了在主线程中对消息的接收过程。
具体地,操作S3通过mHandler.sendMessage(mMessage)方法将消息发送到主线程中,系统会将该消息包装好后发送到mHandler对象所对应的handleMessage(Message msg)函数中,该函数中的msg对象就是发送过来的消息对象mMessage。
调用msg对象中的msg.what方法来解析出消息中的具体消息内容,由于msg.what是一个String类型的ID信息,因此将获取到的msg.what的内容标记为targetID。
通过调用字符串的比较方法以判定mMessage对象中消息ID是否合法。具体地,调用MSG_ID_XXX.equals(targetID),其中,MSG_ID_XXX表示是全局中消息ID,通过对MSG_ID_XXX.equals(targetID)用到来判定MSG_ID_XXX的内容是否和targetID的内容相同,则认为mMessage对象中消息ID是否合法,否则认为mMessage对象中消息ID不合法。
需要说明的是,在上述比较过程中,需要使常量MSG_ID_XXX在前,targetID在后。因为常量MSG_ID_XXX为一个全局常量,不可能为空,因此不会出现空指针的异常情况,假设通过targetID.equals(MSG_ID_XXX)方法来进行比较,虽然也可以对两者的内容比较是否相同但是targetID是一个变量,如果targetID是空时,会出现空指针异常情况。
通过上述字符串比较的方式筛选合法的消息后,通过调用msg.obj来获取到消息的消息内容,由于msg.obj是一个Object的对象,因此还需要通过对其进行对象强制转换来实现消息内容的还原,具体是通过调用(MyBean)msg.obj,这样通过转换后的消息就是一个mMyBean对象,并且该对象已经在主线程中。
S5,主线程采用消息内容对用户界面进行更新。
在上述操作S5中,由于消息已经发送至主线程中,即可直接对UI进行更新操作无需对消息线程判定等冗余逻辑的处理了。
综上所述,本公开采用事件函数onEvent(),能够对特定类型的消息进行获取,提高了接收消息的便捷性;另外,采用系统中Message.obtain()方法在子进程中获取一个消息,能够对消息进行复用提高消息获取的速度;再者,通过消息ID的设定,能够使得主线程成功获取到特定的消息。通过本公开上述的方法,能够自动将子线程的消息转化为主线程消息,这样,系统在接收到消息后无需判定消息的线程问题进而直接进行UI更新,提高了消息的处理效率和降低了线程判定的冗余逻辑。
如图2所示,电子设备200包括处理器210、计算机可读存储介质220。该电子设备200具体是Android电子设备,包括:
处理器;
存储器,其存储有计算机可执行程序,该程序在被所述处理器执行时,使得所述处理器执行:
S1,对消息总线中的消息进行筛选,获取特定消息类型的消息。
在上述操作S1中,实现了对特定消息类型的消息的接收,其中,该特定消息类型的消息为用于进行UI更新的消息。具体地,本公开实施例为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型,其中,每个消息都有唯一的消息数据Bean结构。
接着,本公开实施例定义一个用于接收特定类型消息的函数onEvent:
public void onEvent(MyBean mMyBean);
其中,onEvent()函数中的参数MyBean为一个特定类型消息的Bean结构(该Bean结构为MyBean)。
当每个消息通过消息总线时,消息总线自动对根据每个消息的Bean结构,对子线程的消息进行筛选,找到符合onEvent()函数中参数类型的消息,作为特定消息类型的消息,并将该消息分发到对应的onEvent()函数中。
同理,本公开若需要获取其他类型的消息,只需要修改onEvent()函数中的参数即可。
通过操作S1可以看出,本公开实施例通过一个自定义的onEvent()函数来匹配出特定消息类型的消息,相比于现有技术中通过监听器进行消息监听流程(需要注册监听流程和反注册监听流程),提高了获取消息的便捷性。
S2,采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID。
在操作S1中接收到特定类型的消息后,若消息是在子线程中,则该子线程无法根据该消息进行UI更新操作,如果需要进行UI更新操作,需要将该消息转发到主线程中。在上述操作S2中,实现了将消息转发到主线程之前进行数据封装的过程。
具体地,定义一个Handler对象,Handler对象是Android系统中提供的一个消息通信机制。定义Handler的方法是通过调用Handler mHandler=new Handler()的方法来构建一个mHandler对象。
另外,为了对消息进行转发,本公开实施例定义一个全局的消息ID。针对上述的具有MyBean结构的消息,其对应的全局的消息ID为:MSG_ID_MY_BEAN=”msg_id_my_bean”,其类型为public static final String,该消息id是一个常量其值后续不可再更改。由上述可知,消息ID的定义是具有一定的规则的,所有消息ID的修饰符是public static finalString类型,其消息ID的名称规则是MSG_ID_XXX(XXX表示具体的消息名称),其消息id的值是MSG_ID_XXX的全小写字母。这种规则能够确保消息的唯一性的同时能够快速的对消息进行分辨,提高消息的可辨识性。
接着,通过Message对象中的Message.obtain()方法来获取一个消息,本公开实施例之所以用Message.obtain()方法来获取一个消息,其优势在于能够对消息进行复用,提高消息获取的速度。现有技术中通过Message的构造函数通过Message msg=new Message()的方式来构造Msg,这种方式构造msg的开销会非常大,降低了消息构造的效率,而且无法对消息进行复用处理。将Message.obtain()方法获取到的Message标记为mMessage,然后通过对mMessage.what=MSG_ID_MY_BEAN和mMessage.obj=MyBean方式,来对获取到的mMessage进行赋值操作。其中mMessage.what=MSG_ID_MY_BEAN表示,对消息设置一个唯一的消息ID并将该ID信息封装到消息的what参数中。mMessage.obj=MyBean表示,将消息对象封装到消息的obj对象中。通过以上操作,使得mMessage对象包含有消息ID和消息的内容信息。
S3,采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中。
在上述操作S3中,mHandler.sendMessage()为系统自带的方法,用于对mMessage对象进行发送。通过将mMessage对象作为参数值,并执行mHandler.sendMessage(mMessage),实现了将封装好了mMessage对象发送至主线程中。
S4,在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
在上述操作S4中,实现了在主线程中对消息的接收过程。
具体地,操作S3通过mHandler.sendMessage(mMessage)方法将消息发送到主线程中,系统会将该消息包装好后发送到mHandler对象所对应的handleMessage(Message msg)函数中,该函数中的msg对象就是发送过来的消息对象mMessage。
调用msg对象中的msg.what方法来解析出消息中的具体消息内容,由于msg.what是一个String类型的ID信息,因此将获取到的msg.what的内容标记为targetID。
通过调用字符串的比较方法以判定mMessage对象中消息ID是否合法。具体地,调用MSG_ID_XXX.equals(targetID),其中,MSG_ID_XXX表示是全局中消息ID,通过对MSG_ID_XXX.equals(targetID)用到来判定MSG_ID_XXX的内容是否和targetID的内容相同,则认为mMessage对象中消息ID是否合法,否则认为mMessage对象中消息ID不合法。
需要说明的是,在上述比较过程中,需要使常量MSG_ID_XXX在前,targetID在后。因为常量MSG_ID_XXX为一个全局常量,不可能为空,因此不会出现空指针的异常情况,假设通过targetID.equals(MSG_ID_XXX)方法来进行比较,虽然也可以对两者的内容比较是否相同但是targetID是一个变量,如果targetID是空时,会出现空指针异常情况。
通过上述字符串比较的方式筛选合法的消息后,通过调用msg.obj来获取到消息的消息内容,由于msg.obj是一个Object的对象,因此还需要通过对其进行对象强制转换来实现消息内容的还原,具体是通过调用(MyBean)msg.obj,这样通过转换后的消息就是一个mMyBean对象,并且该对象已经在主线程中。
S5,主线程采用消息内容对用户界面进行更新。
在上述操作S5中,由于消息已经发送至主线程中,即可直接对UI进行更新操作无需对消息线程判定等冗余逻辑的处理了。
综上所述,本公开采用事件函数onEvent(),能够对特定类型的消息进行获取,提高了接收消息的便捷性;另外,采用系统中Message.obtain()方法在子进程中获取一个消息,能够对消息进行复用提高消息获取的速度;再者,通过消息ID的设定,能够使得主线程成功获取到特定的消息。通过本公开上述的方法,能够自动将子线程的消息转化为主线程消息,这样,系统在接收到消息后无需判定消息的线程问题进而直接进行UI更新,提高了消息的处理效率和降低了线程判定的冗余逻辑。
具体地,处理器210例如可以包括通用微处理器、指令集处理器和/或相关芯片组和/或专用微处理器(例如,专用集成电路(ASIC)),等等。处理器210还可以包括用于缓存用途的板载存储器。处理器210可以是用于执行参考图1描述的根据本公开实施例的方法流程的不同动作的单一处理单元或者是多个处理单元。
计算机可读存储介质220,例如可以是能够包含、存储、传送、传播或传输指令的任意介质。例如,可读存储介质可以包括但不限于电、磁、光、电磁、红外或半导体系统、装置、器件或传播介质。可读存储介质的具体示例包括:磁存储装置,如磁带或硬盘(HDD);光存储装置,如光盘(CD-ROM);存储器,如随机存取存储器(RAM)或闪存;和/或有线/无线通信链路。
计算机可读存储介质220可以包括计算机程序221,该计算机程序221可以包括代码/计算机可执行指令,其在由处理器210执行时使得处理器210执行例如上面结合图1所描述的方法流程及其任何变形。
计算机程序221可被配置为具有例如包括计算机程序模块的计算机程序代码。例如,在示例实施例中,计算机程序221中的代码可以包括一个或多个程序模块,例如包括221A、模块221B、……。应当注意,模块的划分方式和个数并不是固定的,本领域技术人员可以根据实际情况使用合适的程序模块或程序模块组合,当这些程序模块组合被处理器210执行时,使得处理器210可以执行例如上面结合图1所描述的方法流程及其任何变形。
图3示意性示出了本公开实施例提供的Android系统中的消息处理装置的流程图。
如图3所示,消息处理装置300包括:
消息筛选模块310,用于对消息总线中的消息进行筛选,获取特定消息类型的消息。
在上述消息筛选模块310中,实现了对特定消息类型的消息的接收,其中,该特定消息类型的消息为用于进行UI更新的消息。具体地,本公开实施例为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型,其中,每个消息都有唯一的消息数据Bean结构。
接着,本公开实施例定义一个用于接收特定类型消息的函数onEvent:
public void onEvent(MyBean mMyBean);
其中,onEvent()函数中的参数MyBean为一个特定类型消息的Bean结构(该Bean结构为MyBean)。
当每个消息通过消息总线时,消息总线自动对根据每个消息的Bean结构,对子线程的消息进行筛选,找到符合onEvent()函数中参数类型的消息,作为特定消息类型的消息,并将该消息分发到对应的onEvent()函数中。
同理,本公开若需要获取其他类型的消息,只需要修改onEvent()函数中的参数即可。
通过消息筛选模块310可以看出,本公开实施例通过一个自定义的onEvent()函数来匹配出特定消息类型的消息,相比于现有技术中通过监听器进行消息监听流程(需要注册监听流程和反注册监听流程),提高了获取消息的便捷性。
消息获取模块320,用于采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID。
在消息筛选模块310中接收到特定类型的消息后,若消息是在子线程中,则该子线程无法根据该消息进行UI更新操作,如果需要进行UI更新操作,需要将该消息转发到主线程中。在消息获取模块320中,实现了将消息转发到主线程之前进行数据封装的过程。
具体地,定义一个Handler对象,Handler对象是Android系统中提供的一个消息通信机制。定义Handler的方法是通过调用Handler mHandler=new Handler()的方法来构建一个mHandler对象。
另外,为了对消息进行转发,本公开实施例定义一个全局的消息ID。针对上述的具有MyBean结构的消息,其对应的全局的消息ID为:MSG_ID_MY_BEAN=”msg_id_my_bean”,其类型为public static final String,该消息id是一个常量其值后续不可再更改。由上述可知,消息ID的定义是具有一定的规则的,所有消息ID的修饰符是public static finalString类型,其消息ID的名称规则是MSG_ID_XXX(XXX表示具体的消息名称),其消息id的值是MSG_ID_XXX的全小写字母。这种规则能够确保消息的唯一性的同时能够快速的对消息进行分辨,提高消息的可辨识性。
接着,通过Message对象中的Message.obtain()方法来获取一个消息,本公开实施例之所以用Message.obtain()方法来获取一个消息,其优势在于能够对消息进行复用,提高消息获取的速度。现有技术中通过Message的构造函数通过Message msg=new Message()的方式来构造Msg,这种方式构造msg的开销会非常大,降低了消息构造的效率,而且无法对消息进行复用处理。将Message.obtain()方法获取到的Message标记为mMessage,然后通过对mMessage.what=MSG_ID_MY_BEAN和mMessage.obj=MyBean方式,来对获取到的mMessage进行赋值操作。其中mMessage.what=MSG_ID_MY_BEAN表示,对消息设置一个唯一的消息ID并将该ID信息封装到消息的what参数中。mMessage.obj=MyBean表示,将消息对象封装到消息的obj对象中。通过以上操作,使得mMessage对象包含有消息ID和消息的内容信息。
消息发送模块330,用于采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中。
在消息发送模块330中,mHandler.sendMessage()为系统自带的方法,用于对mMessage对象进行发送。通过将mMessage对象作为参数值,并执行mHandler.sendMessage(mMessage),实现了将封装好了mMessage对象发送至主线程中。
判定模块340,用于在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
在判定模块340中,实现了在主线程中对消息的接收过程。
具体地,判定模块340通过mHandler.sendMessage(mMessage)方法将消息发送到主线程中,系统会将该消息包装好后发送到mHandler对象所对应的handleMessage(Message msg)函数中,该函数中的msg对象就是发送过来的消息对象mMessage。
调用msg对象中的msg.what方法来解析出消息中的具体消息内容,由于msg.what是一个String类型的ID信息,因此将获取到的msg.what的内容标记为targetID。
通过调用字符串的比较方法以判定mMessage对象中消息ID是否合法。具体地,调用MSG_ID_XXX.equals(targetID),其中,MSG_ID_XXX表示是全局中消息ID,通过对MSG_ID_XXX.equals(targetID)用到来判定MSG_ID_XXX的内容是否和targetID的内容相同,则认为mMessage对象中消息ID是否合法,否则认为mMessage对象中消息ID不合法。
需要说明的是,在上述比较过程中,需要使常量MSG_ID_XXX在前,targetID在后。因为常量MSG_ID_XXX为一个全局常量,不可能为空,因此不会出现空指针的异常情况,假设通过targetID.equals(MSG_ID_XXX)方法来进行比较,虽然也可以对两者的内容比较是否相同但是targetID是一个变量,如果targetID是空时,会出现空指针异常情况。
通过上述字符串比较的方式筛选合法的消息后,通过调用msg.obj来获取到消息的消息内容,由于msg.obj是一个Object的对象,因此还需要通过对其进行对象强制转换来实现消息内容的还原,具体是通过调用(MyBean)msg.obj,这样通过转换后的消息就是一个mMyBean对象,并且该对象已经在主线程中。
更新模块350,用于使主线程采用消息内容对用户界面进行更新。
在更新模块350中,由于消息已经发送至主线程中,即可直接对UI进行更新操作无需对消息线程判定等冗余逻辑的处理了。
综上所述,本公开采用事件函数onEvent(),能够对特定类型的消息进行获取,提高了接收消息的便捷性;另外,采用系统中Message.obtain()方法在子进程中获取一个消息,能够对消息进行复用提高消息获取的速度;再者,通过消息ID的设定,能够使得主线程成功获取到特定的消息。通过本公开上述的方法,能够自动将子线程的消息转化为主线程消息,这样,系统在接收到消息后无需判定消息的线程问题进而直接进行UI更新,提高了消息的处理效率和降低了线程判定的冗余逻辑。
可以理解的是,消息筛选模块310、消息获取模块320、消息发送模块330、判定模块340、更新模块350可以合并在一个模块中实现,或者其中的任意一个模块可以被拆分成多个模块。或者,这些模块中的一个或多个模块的至少部分功能可以与其他模块的至少部分功能相结合,并在一个模块中实现。根据本发明的实施例,消息筛选模块310、消息获取模块320、消息发送模块330、判定模块340、更新模块350、中的至少一个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)、片上系统、基板上的系统、封装上的系统、专用集成电路(ASIC),或可以以对电路进行集成或封装的任何其他的合理方式等硬件或固件来实现,或以软件、硬件以及固件三种实现方式的适当组合来实现。或者消息筛选模块310、消息获取模块320、消息发送模块330、判定模块340、更新模块350中的至少一个可以至少被部分地实现为计算机程序模块,当该程序被计算机运行时,可以执行相应模块的功能。
尽管已经参照本公开的特定示例性实施例示出并描述了本公开,但是本领域技术人员应该理解,在不背离所附权利要求及其等同物限定的本公开的精神和范围的情况下,可以对本公开进行形式和细节上的多种改变。因此,本公开的范围不应该限于上述实施例,而是应该不仅由所附权利要求来进行确定,还由所附权利要求的等同物来进行限定。
Claims (10)
1.一种Android系统中的消息处理方法,包括:
对消息总线中的消息进行筛选,获取特定消息类型的消息;
采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID;
采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中;
在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
2.根据权利要求1所述的Android系统中的消息处理方法,其中,所述对消息总线中的消息进行筛选,获取特定消息类型的消息,包括:
为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型;
根据每个消息的Bean结构,对消息总线中的消息进行筛选,得到特定消息类型的消息。
3.根据权利要求2所述的Android系统中的消息处理方法,所述对消息总线中的消息进行筛选,获取特定消息类型的消息,还包括:
将得到特定消息类型的消息发送至onEvent()函数,该onEvent()函数中的参数类型为所述特定消息类型的消息。
4.根据权利要求1所述的Android系统中的消息处理方法,其中,所述在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容,包括:
将所述mMessage对象中消息ID与全局中的消息ID进行对比,若一致,则所述mMessage对象中消息ID合法,否则所述mMessage对象中消息ID不合法。
5.根据权利要求1所述的Android系统中的消息处理方法,其中,还包括:
所述主线程采用所述消息内容对用户界面进行更新。
6.根据权利要求2所述的Android系统中的消息处理方法,其中,所述消息ID为MSG_ID_XXX,其中,XXX为所述Bean结构的名称。
7.根据权利要求1所述的Android系统中的消息处理方法,其中,采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中,包括:
将所述mMessage对象作为参数值,并执行mHandler.sendMessage(mMessage),以将mMessage对象发送至主线程中。
8.一种Android电子设备,包括:
处理器;
存储器,其存储有计算机可执行程序,该程序在被所述处理器执行时,使得所述处理器执行:
对消息总线中的消息进行筛选,获取特定消息类型的消息;
采用Android系统中的Message.obtain()方法获取所述特定消息类型的消息,得到一个mMessage对象,其中,所述mMessage对象包括该消息的消息内容及消息ID;
采用Android系统中的mHandler.sendMessage()方法,将所述mMessage对象发送到主线程中;
在主线程中判定所述mMessage对象中消息ID是否合法,如果是,则获取所述mMessage对象中的消息内容。
9.根据权利要求8所述的Android电子设备,其中,所述处理器对消息总线中的消息进行筛选,获取特定消息类型的消息,包括:
为每个消息设置一个Bean结构,该Bean结构用于标识每个消息的消息类型;
根据每个消息的Bean结构,对消息总线中的消息进行筛选,得到特定消息类型的消息。
10.根据权利要求9所述的Android电子设备,所述处理器对消息总线中的消息进行筛选,获取特定消息类型的消息,还包括:
将得到特定消息类型的消息发送至onEvent()函数,该onEvent()函数中的参数类型为所述特定消息类型的消息。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810657259.1A CN108874494A (zh) | 2018-06-22 | 2018-06-22 | 一种Android系统中的消息处理方法及Android电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810657259.1A CN108874494A (zh) | 2018-06-22 | 2018-06-22 | 一种Android系统中的消息处理方法及Android电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN108874494A true CN108874494A (zh) | 2018-11-23 |
Family
ID=64295041
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810657259.1A Pending CN108874494A (zh) | 2018-06-22 | 2018-06-22 | 一种Android系统中的消息处理方法及Android电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108874494A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112214234A (zh) * | 2020-10-24 | 2021-01-12 | 鹰信科技有限公司 | 基于java的ui更新方法、系统及其存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107506184A (zh) * | 2017-08-07 | 2017-12-22 | 上海青橙实业有限公司 | 系统应用消息的处理方法和装置 |
CN108008950A (zh) * | 2017-11-24 | 2018-05-08 | 武汉斗鱼网络科技有限公司 | 一种用户界面更新的实现方法及装置 |
-
2018
- 2018-06-22 CN CN201810657259.1A patent/CN108874494A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107506184A (zh) * | 2017-08-07 | 2017-12-22 | 上海青橙实业有限公司 | 系统应用消息的处理方法和装置 |
CN108008950A (zh) * | 2017-11-24 | 2018-05-08 | 武汉斗鱼网络科技有限公司 | 一种用户界面更新的实现方法及装置 |
Non-Patent Citations (2)
Title |
---|
冯贺等: ""Android中的多线程与消息处理"", 《ANDROID程序设计实用教程-ANDROID STUDIO版》 * |
黑马程序员: ""简述对Eventbus的理解"", 《面试宝典》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112214234A (zh) * | 2020-10-24 | 2021-01-12 | 鹰信科技有限公司 | 基于java的ui更新方法、系统及其存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN111818136B (zh) | 数据处理方法、装置、电子设备及计算机可读介质 | |
CN102982169B (zh) | 用于隔离网页插件的浏览器和方法 | |
US9673824B2 (en) | Techniques and circuitry for configuring and calibrating an integrated circuit | |
CN104852939B (zh) | 一种部署能力接口的方法和系统 | |
US10033638B1 (en) | Executing a selected sequence of instructions depending on packet type in an exact-match flow switch | |
US20230409580A1 (en) | Unified description scheme for controlling and operating network connected devices | |
US20110137958A1 (en) | Implementation Method of DATACOM Data Command Platform | |
CN107924330B (zh) | 用于集成的线程调度的计算设备和方法 | |
US9807006B1 (en) | Crossbar and an egress packet modifier in an exact-match flow switch | |
US20230393858A1 (en) | Techniques for bootstrapping across secure air gaps with static sidecar | |
CN113722055A (zh) | 数据处理方法、装置、电子设备和计算机可读介质 | |
CN110569038B (zh) | 随机验证参数设计方法、装置、计算机设备及存储介质 | |
CN108874494A (zh) | 一种Android系统中的消息处理方法及Android电子设备 | |
US9235207B2 (en) | Method for automatically generating dynamic frame packing groups | |
CN107111495A (zh) | 用于虚拟和接口方法调用的装置和方法 | |
CN113037812A (zh) | 数据包调度方法、装置、电子设备、介质和智能网卡 | |
CN102904826A (zh) | 流量负载分担的方法及设备 | |
CN108920144B (zh) | 一种消息处理方法和装置 | |
CN110471934A (zh) | 业务数据的校验方法、装置、介质及电子设备 | |
CN113179332B (zh) | 用于获取配置信息的方法、电子设备和存储介质 | |
US20230393859A1 (en) | Techniques for bootstrapping across secure air gaps with edge device cluster | |
CN109347758A (zh) | 一种报文压缩的方法、设备、系统和介质 | |
EP3382479A1 (en) | Rule-based communicating of equipment data from an industrial system to an analysis system using uni-directional interfaces | |
US9756152B1 (en) | Making a flow ID for an exact-match flow table using a byte-wide multiplexer circuit | |
US9819585B1 (en) | Making a flow ID for an exact-match flow table using a programmable reduce table circuit |
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 | ||
RJ01 | Rejection of invention patent application after publication | ||
RJ01 | Rejection of invention patent application after publication |
Application publication date: 20181123 |