- 浏览: 367112 次
- 性别:
- 来自: 帝都
文章分类
最新评论
-
born19930314:
你好,请问还在吗?我的targetObject中由于含有无法序 ...
Quartz集群配置(100%成功) -
stone_yw:
想问一下,如果quartz只有一个任务,但是这个任务的执行时间 ...
Quartz集群配置(100%成功) -
yandype:
mzxueyun 写道 ERROR c.t.k.m.biz.M ...
Quartz集群配置(100%成功) -
x123456789a:
...
Quartz集群配置(100%成功) -
knight_black_bob:
startjava.io.IOException: Conne ...
TFTP的文件管理
观察者模式应用实例——Broadercast实现进程间异步通信
1 Broadcast实现进程通信
利用Broadcast可以实现Android中的进程间通信。
比如,存在客户端BCClient和服务端BCService这两个不同的进程,它们之间的通信过程具体如下图所示:
通过这样的方式双方能完成通信,不过要达到异步通信的目的,需要进一步改进设计。
2实现异步通信
为了实现异步通信,需要对客户端的类进行重新设计,同时考虑到系统的扩展性、可复用性,以及服务端对外接口的易用性。选择将BCClient的视图ClientActivity剥离出去,并对ClientReceiver做进一步封装,相当于在原客户端和服务端中间构建出一层作为中间层。
为了便于说明,客户端和服务端需要一个应用场景。假设服务端负责管理系统相关设备,并提供操作设备的接口,而客户端则根据需求通过中间件来异步调用相应的服务。
比如,用户点击客户端的按钮来获取设备信息,并且点击按钮后用户不必一直等待服务端返回信息才能继续操作,而是服务端响应完成后自动通知客户端。
由于整个过程客户端不是进行同步等待,而是异步接收,设计时考虑引入设计模式中的“观察者模式”。
2.1 观察者模式
通过以上分析,明确了设计的改进重点在于对ClientReceiver的封装,并且封装采取的合理策略应当是 “观察者模式”。改进设计后ClientReceiver就被中间层所替代,中间层的类图如下:
从类图中不难看出,这是一个典型的“观察者模式”的类设计模型,DevListener对应于观察者模式中的观察者“Observer”,而DevManager就是观察者模式中的主题“Subject”。原ClientReceiver的主要功能被封装在中间层的DevReceiver类中,而服务端接口的直接调用者是DevManager类。
2.2 客户端服务端交互流程
在加入“观察者模式”后,客户端和服务端的交互流程如下:
1、客户端-->创建监听器-->在监听器中重写回调函数,用于处理服务端返回结果-->将该监听器注册到DevManager -->调用DevManager 的readDevInfo方法向服务端发送广播;
2、服务端-->利用BroadcastReceiver接受到广播信息-->处理信息-->向客户端(DevReceiver)发送广播信息;
3、客户端-->利用BroadcastReceiver(DevReceiver)接受到广播信息-->调用DevManager的notifyListener方法-->调用客户端重写好的回调函数,完成异步通信。
2.3 客户端调用
加入中间层后,客户端能够方便的使用DevManager提供的服务,在使用DevManager提供的服务时如同使用Button控件一样(Button控件的内部实现也是利用了观察者模式)方便、简洁。
客户端调用代码如下:
客户端的调用服务过程主要是通过DevManager对监听器DevListener进行注册、监听。运行结果如下,当点击“send”按钮的时候发送设备读取请求,即调用readDevInfo方法,点击完成后不必等待服务端的相应。
服务端处理完客户端请求后,会向中间层的DevReceiver发送广播,DevReceiver接到广播后回调客户端重载的dealWith函数,部分代码如下:
回调完成后,客户端获取到服务端信息:
3 小结
观察者模式的核心思想是将数据表示层和逻辑层分离,并定义了稳定的消息传递机制、抽象出调用接口。在需要采用异步通信的应用场景中,合理地运用观察者模式往往会有很好的效果。
当然观察者模式也存在有缺陷。目前本例中的Observer(即本例中的DevListener)只有一个,如果一个Subject(即本例中的DevManager)中注册有大量Observer(即DevManager中存在一个存放DevListener的集合)的话,在广播通知Observer时存在效率问题,毕竟需要遍历集合中所有的Observer。
原文链接:http://www.linuxidc.com/Linux/2011-09/42585.htm
1 Broadcast实现进程通信
利用Broadcast可以实现Android中的进程间通信。
比如,存在客户端BCClient和服务端BCService这两个不同的进程,它们之间的通信过程具体如下图所示:
通过这样的方式双方能完成通信,不过要达到异步通信的目的,需要进一步改进设计。
2实现异步通信
为了实现异步通信,需要对客户端的类进行重新设计,同时考虑到系统的扩展性、可复用性,以及服务端对外接口的易用性。选择将BCClient的视图ClientActivity剥离出去,并对ClientReceiver做进一步封装,相当于在原客户端和服务端中间构建出一层作为中间层。
为了便于说明,客户端和服务端需要一个应用场景。假设服务端负责管理系统相关设备,并提供操作设备的接口,而客户端则根据需求通过中间件来异步调用相应的服务。
比如,用户点击客户端的按钮来获取设备信息,并且点击按钮后用户不必一直等待服务端返回信息才能继续操作,而是服务端响应完成后自动通知客户端。
由于整个过程客户端不是进行同步等待,而是异步接收,设计时考虑引入设计模式中的“观察者模式”。
2.1 观察者模式
通过以上分析,明确了设计的改进重点在于对ClientReceiver的封装,并且封装采取的合理策略应当是 “观察者模式”。改进设计后ClientReceiver就被中间层所替代,中间层的类图如下:
从类图中不难看出,这是一个典型的“观察者模式”的类设计模型,DevListener对应于观察者模式中的观察者“Observer”,而DevManager就是观察者模式中的主题“Subject”。原ClientReceiver的主要功能被封装在中间层的DevReceiver类中,而服务端接口的直接调用者是DevManager类。
2.2 客户端服务端交互流程
在加入“观察者模式”后,客户端和服务端的交互流程如下:
1、客户端-->创建监听器-->在监听器中重写回调函数,用于处理服务端返回结果-->将该监听器注册到DevManager -->调用DevManager 的readDevInfo方法向服务端发送广播;
2、服务端-->利用BroadcastReceiver接受到广播信息-->处理信息-->向客户端(DevReceiver)发送广播信息;
3、客户端-->利用BroadcastReceiver(DevReceiver)接受到广播信息-->调用DevManager的notifyListener方法-->调用客户端重写好的回调函数,完成异步通信。
2.3 客户端调用
加入中间层后,客户端能够方便的使用DevManager提供的服务,在使用DevManager提供的服务时如同使用Button控件一样(Button控件的内部实现也是利用了观察者模式)方便、简洁。
客户端调用代码如下:
public class ClientActivity extends Activity { private static final String TAG = "ClientActivity>>>>>>>>>"; private DevManager dm; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.i(TAG,"onCreate"); Button button = (Button)findViewById(R.id.button); button.setOnClickListener(new BroadcastListener()); dm = DevManager.getInstance(); dm.setDevListener(new DevListener(){ @Override public void dealWith(DevEvent event) { Toast.makeText(getApplicationContext(),event.getEventContent(), 10000).show(); } }); } class BroadcastListener implements OnClickListener{ @Override public void onClick(View view) { Log.i(TAG, "Click SendButton"); dm.readDevInfo(view.getContext()); } } }
客户端的调用服务过程主要是通过DevManager对监听器DevListener进行注册、监听。运行结果如下,当点击“send”按钮的时候发送设备读取请求,即调用readDevInfo方法,点击完成后不必等待服务端的相应。
服务端处理完客户端请求后,会向中间层的DevReceiver发送广播,DevReceiver接到广播后回调客户端重载的dealWith函数,部分代码如下:
public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("DoServiceResponse")){ Log.i(TAG,"Action Is DoServiceResponse"); Communication info = (Communication)intent.getParcelableExtra("ResponseInfo"); if(info != null){ Log.i(TAG,"Receive ResponseInfo"); DevEvent event = new DevEvent(); event.setEventContent(info.getContent()); DevManager.getInstance().notifyListener(event); } } //notifyListener的实现如下: public void notifyListener(DevEvent event){ if(listener == null){ return; } else{ Log.i(TAG, "Notify Listener"); listener.dealWith(event); } }
回调完成后,客户端获取到服务端信息:
3 小结
观察者模式的核心思想是将数据表示层和逻辑层分离,并定义了稳定的消息传递机制、抽象出调用接口。在需要采用异步通信的应用场景中,合理地运用观察者模式往往会有很好的效果。
当然观察者模式也存在有缺陷。目前本例中的Observer(即本例中的DevListener)只有一个,如果一个Subject(即本例中的DevManager)中注册有大量Observer(即DevManager中存在一个存放DevListener的集合)的话,在广播通知Observer时存在效率问题,毕竟需要遍历集合中所有的Observer。
原文链接:http://www.linuxidc.com/Linux/2011-09/42585.htm
发表评论
-
安卓CMD
2012-06-02 18:02 1212引用Android系统中的“CMD”,用命令行管理你的手机。 ... -
Android的静态注册广播问题
2012-05-29 15:26 4177引用 2. Static registering The ad ... -
Android ListView 显示Drawable对象
2012-05-17 14:37 1074http://www.cnblogs.com/thu539/a ... -
Android 开启WIFI 广播接收
2012-05-16 09:21 2077WifiManager wifiManager = (Wi ... -
Android Activity Task
2012-05-11 11:12 952引用A task is a collection of act ... -
Android Binder机制,虚拟机
2012-05-08 10:29 1470http://blog.csdn.net/luoshengya ... -
Android流量统计
2012-05-03 11:06 1545static long getMobileRxBytes ... -
Andriod WIFI模块
2012-03-30 09:53 773http://blog.163.com/wxiongn@126 ... -
Android Service相关
2012-03-26 14:22 873http://developer.android.com/re ... -
Android应用程序设计策略
2012-03-23 16:28 1142一个成功的Android应用程序往往提供一个突出的用户体验。当 ... -
sqlite工具类
2012-03-22 15:00 6156package com.asc.db; import ... -
ksoap2实现webservice工具类
2012-03-22 14:58 4032package com.ksoaptest.util; ... -
ProgressBar教程
2012-03-21 11:39 949http://blog.csdn.net/Android_Tu ... -
Android webservice
2012-02-21 09:24 0http://blog.csdn.net/kangkangz4 ... -
sina 微博异步调用API
2011-12-30 09:00 1592AsyncWeiboRunner public clas ... -
Android 反编译
2011-12-14 17:39 866http://blog.csdn.net/sunboy_205 ... -
Android 权限相关问题
2011-12-13 19:59 2936ServiceMananger管理Service需要Syste ... -
Binding with unknown activity
2011-12-08 11:45 1261在TabActivity中bindservice时报错: ... -
Android Handler线程间通信机制分析
2011-12-06 19:50 2173Looper: 循环处理消息队列 //用法: cl ... -
Android相关工具地址
2011-12-02 21:40 819SDK: http://developer.android. ...
相关推荐
本文将深入探讨一种常用的设计模式——观察者模式(Observer Pattern),并结合Android实际应用给出实例解析。 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,...
观察者模式详解 观察者模式是23种设计模式中的一种,尤其是在软件设计过程中体现的更是立足...观察者模式是一种常用的设计模式,广泛应用于软件开发中。本文详细讲解了观察者模式的概念和实现,希望对读者有所帮助。
观察者模式(Observer Pattern)是一种行为设计模式,它允许你定义一个订阅机制,可以在对象状态改变时通知多个“观察”该对象的其他对象。在Android开发中,这种模式被广泛用于构建可扩展和灵活的系统,例如事件...
通过这个以TextView为例的观察者模式应用,我们可以看到设计模式在实际开发中的重要性,它可以帮助我们编写更灵活、可复用的代码,提高代码的可维护性和可读性。在学习和使用设计模式的过程中,我们应该结合实际场景...
这个例子展示了如何在Android项目中使用Kotlin和`java.util.*`包中的观察者模式,虽然在现代Android开发中,我们更倾向于使用Kotlin的协程和LiveData等工具来实现异步通信和事件处理,但理解基本的观察者模式对于...
6. **回调函数**:在Android开发中,我们也经常使用回调函数来实现观察者模式,例如OnClickListener、OnCheckedChangeListener等,这些都是观察者模式的实例。 7. **订阅与退订**:为了防止内存泄漏,观察者在不再...
在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它允许对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。EventBus是一款轻量级的事件总线...
在Android系统中,这种模式被广泛应用于数据变更的通知机制,例如ListView的Adapter就是典型的观察者模式应用场景。 在观察者模式中,存在四个主要的角色: 1. 抽象主题(Subject):这是被观察的对象,通常包含一...
在Android中,最常见的观察者模式应用是BroadcastReceiver(广播接收器)。BroadcastReceiver可以监听系统或者自定义的广播事件,当特定的广播事件发生时,BroadcastReceiver的onReceive()方法会被调用,开发者在...
通过定义自定义的`Observer`和`Observable`,我们可以轻松地在Android应用中实现Activity间的通信,特别是在涉及到多个活动参与的数据流更新时,观察者模式能大大简化代码结构,提高可维护性。在Test文件中,可能...
在Android开发中,观察者模式(Observer Pattern)是一种常见的设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。在这个"android观察者模式...
Android 编程设计模式之观察者模式实例详解 Android 编程设计模式之观察者模式是 Android 开发中的一种重要设计模式,主要用于解决 GUI 系统和订阅——发布系统中的问题。观察者模式可以将被观察者和观察者解耦,...
在实际开发中,很多框架和库也内置了观察者模式,如JavaScript中的EventEmitter(Node.js)、C#的事件和委托,以及Android中的BroadcastReceiver等。这些工具使得开发者可以更便捷地应用观察者模式,提高代码的可...
观察者模式,也被称为发布/订阅模式,是软件设计模式中的一个重要概念,它在很多场景下用于实现对象之间的通信和事件处理。...在实际开发中,观察者模式广泛应用于事件驱动编程、GUI组件通信、状态管理等领域。
在Android开发中,观察者模式的实例包括: - **BroadcastReceiver**:系统广播是一种全局的通知机制,应用可以注册BroadcastReceiver来监听特定的系统或自定义广播事件。 - **LiveData**:在Android架构组件中,...
11. **设计模式**:源码中可能蕴含了单例模式、工厂模式、观察者模式等经典设计模式,这对于理解代码结构和可维护性至关重要。 12. **Material Design**:Android推荐遵循Material Design设计规范,源码可能体现了...
在Android开发中,内容提供者(Content Provider)是Android系统中的四大组件之一,它负责管理应用程序间的数据共享。内容提供者让应用的数据可以被其他应用访问,实现了数据的跨应用共享。在这里,我们将深入探讨...
总之,这份"Android编程典型实例与项目开发案例"光盘源码资源是学习和提升Android开发技能的宝贵资料,它提供了丰富的实践场景,帮助开发者将理论知识转化为实际动手能力,进一步推动个人在Android开发领域的专业...
在Android开发中,Java观察者模式是一种常用的编程设计模式,用于处理对象间的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在处理多组件间的通信和数据同步时...