发明内容
鉴于以上所述现有技术的缺点,本发明的目的在于提供一种Android系统中的View间的通信方法,通过View消息ID来区分View之间需要进行的操作,采取Handler线程来对消息进行管理和派发,不影响Android UI线程的运行,Activity可以根据当前运行情况对View消息进行处理和拦截,从而在减轻Activity的复杂度和冗余度的基础上,还可以丰富View的功能开发和扩展,并且不影响Activity对于View的控制。
为实现上述目的及其他相关目的,本发明提供一种Android系统中的View间的通信方法,包括1)定义与View相对应的View消息ID,采用View消息ID附带相关数据的方式构造View消息;2)建立View消息和View实体的相对应的哈希表,实现View中的View消息的注册;当View从界面中移除时,从哈希表中注销该View所注册的所有View消息;3)创建处理线程,并采用处理线程对View消息进行处理。
根据上述的Android系统中的View间的通信方法,其中:所述相关数据包括View状态变化信息。
根据上述的Android系统中的View间的通信方法,其中:所述View消息ID采用int类型。
根据上述的Android系统中的View间的通信方法,其中:所述View消息对应的数据包采用Android系统的Intent数据结构。
根据上述的Android系统中的View间的通信方法,其中:所述2)中,实现View中的View消息的注册包括以下步骤:
步骤S31、从View的View消息列表中依次读取一个View消息;
步骤S32、判断读取的View消息是否为空;若是,注册完成,流程结束;若否,转入步骤S33;
步骤S33、根据View消息ID搜索View消息所注册的哈希表;
步骤S34、判断是否有其他View注册过该View消息;若是,转入步骤S35;若否,转入步骤S36;
步骤S35、直接将View添加到哈希表中该View消息所对应的View列表中,并转入步骤S31;
步骤S36、在哈希表中创建View消息ID和相对应的View列表;
步骤S37、将View添加到哈希表中新建的View列表中,并转入步骤S31。
根据上述的Android系统中的View间的通信方法,其中:所述2)中,从哈希表中注销该View所注册的View消息包括以下步骤:
步骤S41、从View的View消息列表中依次读取一个View消息;
步骤S42、判断读取的View消息是否为空;若是,注销完成,流程结束;若否,转入步骤S43;
步骤S43、根据View消息ID搜索View消息所注册的哈希表;
步骤S44、从哈希表中读取该View消息所对应的View列表;
步骤S45、从该View列表中删除需要注销的View,转入步骤S41。
根据上述的Android系统中的View间的通信方法,其中:所述处理线程采取View消息驱动方式,当View的状态发生变化并发出View消息时,所述处理线程开始运行。
根据上述的Android系统中的View间的通信方法,其中:所述3)中,所述处理线程包括以下步骤:
步骤S51、从View消息列表中读取View消息ID;
步骤S52、将该View消息转发给Acitivity进行预处理;
步骤S53、若Activity不允许处理该View消息,不执行任何操作,流程结束;否则转入步骤S54;
步骤S54、根据View消息ID搜索View消息所注册的哈希表;
步骤S55、判断是否有View注册过该View消息;若否,不执行任何操作,流程结束;否则转入步骤S56;
步骤S56、读取View消息所对应的View列表;
步骤S57、依次调用每个View实体对应的View消息处理函数。
根据上述的Android系统中的View间的通信方法,其中:若没有接收到View消息,所述处理线程进入睡眠状态。
根据上述的Android系统中的View间的通信方法,其中:所述View消息统一定义在Android系统的Intent.java文件中。
如上所述,本发明的Android系统中的View间的通信方法,具有以下有益效果:
(1)减轻了Activity的复杂度和冗余度;
(2)有效增强了View的功能开发和扩展;
(3)不影响Activity对于View的控制。
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
为了建立View之间的交互通道,如图2所示,本发明的Android系统中的View间的通信方法中,首先需要定义一组View对应的View消息ID(View Message ID),View消息(View Message)对应的数据包采用Android系统的Intent数据结构,这样不需要重新定义新的数据结构。在Activity创建后,需要建立一个哈希表,用于View Message与View实体之间的对应;然后创建Handler线程,用来对View Message进行处理。当View创建后,添加到界面中,需要向Android系统注册View需要处理的View Message列表,系统收到注册请求后,将View Message与注册了该View Message的View实体添加到哈希表中。当View从界面中移除时,需要向Android系统注销该View实体所注册过的全部View Message;Android系统收到注销请求后,遍历哈希表,将各个View Message对应的View实体从哈希表中删除。当View的状态发生变化时,发送对应的View Message给Handler线程,Handler线程收到该ViewMessage后,首先转交给所在的Activity进行预处理,之后在Activity允许的情况下,从哈希表中找到该View Message对应的View列表,然后调用各个View实体对应的View Message处理函数,从而完成View与View之间的交互通信。
具体地,本发明的Android系统中的View间的通信方法包括:
(1)定义与View相对应的View Message ID,采用View Message ID附带相关数据的方式来构造View Message。
具体地,View之间的通信交互通过View Message ID来进行,不管是Android系统自带的View还是后续开发的View。每个View的状态变化需要通知其他View时,都需要预先定一个View Message ID,并将View Message ID附带相关数据形式的View Message发送给Android系统。其中,相关数据包括View状态变化信息。
View Message ID采用int类型,完全可以满足View Message数目上的需求。由于每个View Message均有可能附带相关数据,采用Android系统的Intent数据结构作为数据打包结构,无需重新定义新的数据结构,View Message也统一定义在Android系统的Intent.java文件中,方便View Message ID和相关数据一起访问。
以MyView为例,具体View Message ID定义示例如下:
//当MyView的显示内容发生变化时抛出该消息
public static final int MYVIEW_CHANGE_TEXT_MESSAGE=0x00000001;
//当MyView的显示颜色发生变化时抛出该消息
public static final int MYVIEW_CHANGE_COLOR_MESSAGE=0x00000002;
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
每个View Message对应的Intent数据结构根据具体的实际情况进行定义。一条View Message可以有多个View进行处理。
(2)建立View Message和View实体的相对应的哈希表,实现View中的ViewMessage的注册;当View从界面中移除时,从哈希表中注销该View所注册的所有ViewMessage。
具体地,当界面中的View创建后,并添加到界面中进行显示时,需要向Android系统注册需要处理的多条View Message。同时,Android系统为每个界面配置一张ViewMessage与View实体相对应的哈希表。当View从界面中移除时,需要向Android系统注销该View实体所注册过的全部View Message;Android系统收到注销请求后,遍历哈希表,将各个View Message对应的View实体从哈希表中删除。
参照图3,View Message的注册流程由每个界面对应的View Message注册函数所执行,具体包括以下步骤:
步骤S31、从View的View Message列表中依次读取一个View Message;
步骤S32、判断读取的View Message是否为空;若是,注册完成,流程结束;若否,转入步骤S33;
步骤S33、根据View Message ID搜索View Message所注册的哈希表;
步骤S34、判断是否有其他View注册过该View Message;若是,转入步骤S35;若否,转入步骤S36;
步骤S35、直接将View添加到哈希表中该View Message所对应的View列表中,并转入步骤S31;
步骤S36、在哈希表中创建View Message ID和相对应的View列表;
步骤S37、将View添加到哈希表中新建的View列表中,并转入步骤S31。
参照图4,View Message的注销流程由View Message注销函数所执行,具体包括以下步骤:
步骤S41、从View的View Message列表中依次读取一个View Message;
步骤S42、判断读取的View Message是否为空;若是,注销完成,流程结束;若否,转入步骤S43;
步骤S43、根据View Message ID搜索View Message所注册的哈希表;
步骤S44、从哈希表中读取该View Message所对应的View列表;
步骤S45、从该View列表中删除需要注销的View,转入步骤S41。
(3)创建处理(Handler)线程,并采用Handler线程对View Message进行处理。
在本发明中,需要创建Handler线程。由于View的处理过程属于Android的UI线程,故需要Handler线程负责整个界面的处理和刷新,不能被阻塞,否则会导致屏幕出现卡顿现象,用户体验较差。通过采用Android系统自带的Handler线程对View Message进行处理,使得UI线程中的View将View Message发送出来后,可以继续进行UI方面的处理。
具体地,View Message的处理在每个界面对应的Handler线程中进行处理。Handler线程提供了View Message队列管理机制,View调用Handler线程对应的obtainMessage函数构建Message实体,将View Message ID和打包好的相关数据一起放入Message实体中,然后调用Handler线程对应的sendMessage函数,将View Message发送给Handler线程进行处理即可。
Android的Handler线程采取View Message驱动方式,当View的状态发生变化,并将View Message发送过来时,Handler线程开始运行,首先从View Message列表中取出ViewMessage,转给Activity进行预处理。Activity会根据当前情况决定是否允许该ViewMessage被处理,也就是说Activity可以根据实际情况拦截其界面下所有的View Message,以完成Activity管理View组件的功能。
如果Activity预处理后判断根据当前情况允许View进行后续处理,则从哈希表中读取View Message对应的View列表,然后调用每个View实体对应的View Message处理函数。若View在处理View Message过程中发送新的View Message,Handler线程读取ViewMessage队列,如果有新的View Message,则继续进行处理,否则进入睡眠状态。
如果没有View实体对该View Message进行过注册,则Handler线程直接丢弃该View Message。
参照图5,Handler线程的处理流程包括以下步骤:
步骤S51、从View Message列表中读取View Message ID;
步骤S52、将该View Message转发给Acitivity进行预处理;
步骤S53、若Activity不允许处理该View Message,不执行任何操作,流程结束;否则转入步骤S54;
步骤S54、根据View Message ID搜索View Message所注册的哈希表;
步骤S55、判断是否有View注册过该View Message;若否,不执行任何操作,流程结束;否则转入步骤S56;
步骤S56、读取View Message所对应的View列表;
步骤S57、依次调用每个View实体对应的View Message处理函数。
综上所述,本发明的Android系统中的View间的通信方法减轻了Activity的复杂度和冗余度;有效增强了View的功能开发和扩展;不影响Activity对于View的控制。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。