2010-09-24 65 views
0

執行多項任務,我不知道如何完美地解決了以下任務:同步在Android的

  1. 我有幾個代碼塊(操作)來執行。
  2. 每個塊可以返回truefalse以指示進一步的執行是可能的。
  3. 在每個塊的內部,我必須使用異步方法調用(因爲Android是completeley異步的)。

處理操作(如預期不工作中)的實施例:

 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 registerd低於:

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的異步模式?

回答

0

好吧,這裏是我如何解決了這個問題:執行,這是操作之間共享的

  1. 我創建的上下文。
  2. 每個操作都可以使用適當的方法調用下一個操作,停止進一步處理等。
  3. 每個操作都可以是後臺服務,也可以是Activity。
  4. 完成所有操作後,通過回調通知調用者。
  5. 因爲操作也可以是異步的,所以他們使用通知來了解操作何時完成以及進一步處理。
3

如果要完成的處理量在毫秒範圍內,您可以將代碼重組爲狀態機 - 列舉的子任務和跟蹤當前或下一個要執行的任務的變量。從本質上講,當一個事件進來時,你將通過待辦事項清單,直到你到達一個需要異步操作結果的任務(一個狀態)。此時您啓動異步操作並返回。當您從用戶輸入或其他任何地方獲得事件調用時,您將記錄數據,然後從已保存的狀態編號繼續執行狀態機,直到它再次進入異步操作並返回。但是這隻有在你花費的時間以毫秒爲單位進行測量時纔有效,否則你的行爲會變得遲緩並且沒有反應,在極端情況下觸發ANR。

如果您需要做更多的處理,您應該在後臺線程或服務中執行此操作,後臺線程或服務將消息發佈到UI線程以啓動異步事件,然後等待用可以被翻譯成所需的結果,但同時讓UI線程自由地響應不相關的事件。

+0

實際上處理量可能很大。現在我正在重構我的代碼,因此它將由事件驅動。 – uthark 2010-09-24 15:01:22