2012-04-23 46 views
0

我正在开发一个与手机的WiFi,蓝牙,移动网络交互的应用程序。 该应用程序主要是一个服务,并且GUI不起主要作用。Android:异步事件(意图)处理的设计模式

应用的核心,而服务类的主要方法是接收该应用程序需要接收所有的意图了一个方法:

public void handleIntent(Intent intent){ 

它然后提取意图的行动,并呼吁具体对于相应的意图的动作处理方法,例如接收SCREEN_ON时,它会调用

private void handleScreenOn(){ 

问题是,手机上的一些任务需要一段时间,所以一些其他事件s可能发生在任务处理的中间,这应该改变处理。

例如,打开Wifi需要几秒钟的时间,在实际完成之前发送多个目标WIFI_STATE_CHANGED_ACTION。在启用WiFi的过程中,用户可以关闭屏幕,以便接收意图。

现在说我的应用程序的目标是在屏幕关闭时关闭WiFi。有一种情况会出现问题的情形:

  1. 初始情况:屏幕打开,无线网络是关
  2. 用户切换无线网络设置来启用它。无线上网开始被启用
  3. 用户立刻就变成屏幕关闭
  4. 该应用程序接收SCREEN_OFF意图,但由于无线网络还没有启用,则认为没有必要将其禁用
  5. 无线上网使被完成,无论屏幕关闭,Wifi都会保持启用状态。

如何解决?

目前,在步骤5中,当Wifi终于启用时,我会测试屏幕是否关闭或不再关闭wifi。 该解决方案需要许多if/else处理所有可能的情况。

我敢肯定,必须有这样做,处理堆栈意图,或者像这样的一些清洁的方式...

任何关于如何做到这一点干净一些很好的设计模式或好的建议?

回答

1

无论何时(异步)完成对某个事件的反应,都应考虑发送“已完成操作”事件。现在,您可以在handleIntent()中添加一些逻辑以实现一致的状态。逻辑处于组件的核心位置,避免了代码重复。

或者,你可以尝试序列化你的事件:即当一个事件发生,可能会使一些还没有完成的动作的结果失效(你需要管理一个未完成动作的列表,完成可以被检测到,如上所述)推迟其处理,直到所有这些行动完成。要决定哪些事件可能依赖于其他事件,简单的静态查找表就足够了。

0

另一种方法是维护实体的状态(全部或者只是那些异步的)被管理。对于那些异步的,状态不应该是二进制(ON | OFF),而应该有至少3或4个状态:ON,TURNING_ON,OFF,TURNING_OFF。然后在您的示例步骤4中,当您收到SCREEN_OFF时,请检查WIFI状态ON或TURNING_ON,以确定是否必须将其关闭。