0

我不知道如何优雅地解决以下任务:

  1. 我有几个代码块(操作)要执行。
  2. 每个块都可以返回truefalse指示可以进一步执行。
  3. 在每个块内部,我必须使用异步方法调用(因为 Android 是完全异步的)。

处理操作示例(现在无法按预期工作):

      List<Operation> operations = command.getOperations();
      for (Operation operation : operations) {
          Log.d(TAG, "Processing operation: " + operation);
          OperationResult result = operation.execute(activity);
          Log.d(TAG, "Operation result is: " + result);
          if (!result.canContinue()) {
              break;
          }
      }

问题是我需要的操作内部,例如,显示 AlertDialog 并等待输入。但是在我调用dialog.show()我的方法execute完成后,它返回不正确的结果。

使用 AlertDialog 注册的按钮侦听器示例如下:

 final OperationResult result = new OperationResult();
 final class ButtonListener implements DialogInterface.OnClickListener {

    public void onClick(DialogInterface dialog, int id) {
        switch (id) {
        case DialogInterface.BUTTON_POSITIVE: {
                result.setCanContinue(true);
        }
        case DialogInterface.BUTTON_NEGATIVE: {
            dialog.cancel();
                result.setCanContinue(false);
        }
    }
}

我应该如何修改操作处理以支持 Android 的异步模型?

4

2 回答 2

3

如果要完成的处理量在毫秒范围内,您可以将代码重组为状态机 - 枚举子任务列表和跟踪当前或下一个要执行的任务的变量。本质上,当一个事件出现时,您将通过待办事项列表工作,直到您到达需要异步操作结果的任务(状态)。此时您启动异步操作并返回。当您从用户输入或其他任何地方获得事件调用时,您记录数据,然后从保存的状态编号继续执行状态机,直到它再次遇到异步操作并返回。但这仅在您花费处理时间以毫秒为单位的情况下才有效,否则您会行动迟缓且反应迟钝,在极端情况下会触发 ANR。

如果你需要做更多的处理,你应该在后台线程或服务中进行,它将消息发布到 UI 线程以启动异步事件,然后等待 UI 线程被调用,事件可以被转换为需要的结果,但同时让 UI 线程可以自由地响应不相关的事件。

于 2010-09-24T14:59:01.720 回答
0

好的,这是我解决问题的方法:

  1. 我已经创建了执行上下文,它在操作之间共享。
  2. 每个操作都可以使用适当的方法调用下一个操作、停止进一步处理等。
  3. 每个操作既可以是后台服务,也可以是Activity。
  4. 完成所有操作后,调用者会通过回调得到通知。
  5. 由于操作也可以是异步的,因此它们使用通知来了解操作何时完成并应进行进一步处理。
于 2010-09-24T22:38:26.153 回答