在Android中同步执行多个任务

时间:2010-09-24 14:05:02

标签: android user-interface asynchronous interaction

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

  1. 我有几个代码块(操作)要执行。
  2. 每个块都可以返回true false以表示可以进一步执行。
  3. 在每个块的内部,我必须使用异步方法调用(因为Android是完全异步的)。
  4. 处理操作示例(现在不按预期工作):

          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的异步模型?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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

  1. 我创建了执行的上下文,在操作之间共享。
  2. 每个操作都可以使用适当的方法调用下一个操作,停止进一步处理等。
  3. 每个操作都可以是后台服务,也可以是活动。
  4. 完成所有操作后,将通过回叫通知来电。
  5. 由于操作也可以是异步的,因此他们使用通知来了解操作何时完成并进行进一步处理。