0

我正在开发一个与手机的 WiFi、蓝牙、移动网络交互的应用程序。该应用程序主要是一个服务,GUI 不发挥核心作用。

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

public void handleIntent(Intent intent){

然后它提取意图的动作并为相应意图的动作调用特定的处理程序方法,例如当接收到SCREEN_ON时,它会调用

private void handleScreenOn(){

问题是手机上的某些任务需要一些时间,因此在任务处理过程中可能会发生一些其他事件,那应该改变处理。

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

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

  1. 初始情况:屏幕开启,WiFi 关闭
  2. 用户切换 WiFi 设置以启用它。Wifi 开始启用
  3. 用户几乎立即关闭屏幕
  4. 应用收到 SCREEN_OFF 意图但由于 WiFi 尚未启用,因此它认为没有必要禁用它
  5. Wifi 启用完成,尽管屏幕关闭,Wifi 仍保持启用状态。

如何解决?

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

我敢肯定,必须有一些更清洁的方法,处理一堆意图,或者类似的东西......

任何人都有一些好的设计模式或关于如何干净地完成它的好建议?

4

2 回答 2

1

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

或者,您可以尝试序列化您的事件:即当发生可能使某些尚未完成的操作的结果无效的事件时(您需要管理未完成操作的列表,可以如上所述检测到完成)将其处理推迟到所有那些动作就完成了。要确定哪些事件可能取决于其他事件,一个简单的静态查找表就足够了。

于 2012-04-23T14:11:28.517 回答
0

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

于 2012-04-23T14:29:49.003 回答