0

次のタスクをエレガントに解決する方法がわかりません。

  1. 実行するコード (操作) のブロックがいくつかあります。
  2. 各ブロックは、さらなる実行が可能であることを示すために をtrue返すことができます。false
  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

実行する処理量がミリ秒単位の場合、コードをステート マシン (列挙されたサブタスクのリストと、現在または次に実行されるタスクを追跡する変数) として再構築できます。基本的に、イベントが発生すると、非同期操作の結果を必要とするタスク (状態) に到達するまで、to-do リストを処理します。その時点で、非同期操作を起動して戻ります。ユーザー入力などからイベント呼び出しを取得すると、データを記録し、保存された状態番号からステート マシンの実行を再開し、再び非同期操作に到達して戻るまで続けます。ただし、これは、処理にかかる時間がミリ秒単位で測定されている場合にのみ機能します。そうでない場合は、ラグが発生して応答が遅くなり、極端な場合に ANR がトリガーされます。

さらに処理を行う必要がある場合は、バックグラウンド スレッドまたはサービスで実行する必要があります。これらのスレッドは、メッセージを UI スレッドに投稿して非同期イベントを起動し、UI スレッドがイベントで呼び出されるのを待ちます。結果が必要ですが、その間、無関係なイベントに応答するために UI スレッドを解放します。

于 2010-09-24T14:59:01.720 に答える
0

わかりました、これが私が問題を解決した方法です:

  1. 操作間で共有される実行コンテキストを作成しました。
  2. 各操作は、適切なメソッドを使用して、次の操作を呼び出したり、以降の処理を停止したりできます。
  3. 各操作は、バックグラウンド サービスまたはアクティビティのいずれかになります。
  4. すべての操作が完了すると、発信者はコールバックを介して通知されます。
  5. 操作も非同期になる可能性があるため、通知を使用して、操作がいつ完了し、さらに処理を行う必要があるかを認識します。
于 2010-09-24T22:38:26.153 に答える