2015-01-15 30 views
8

在Android上運行時,有問題的程序控制從屬藍牙(BT)設備。它具有幾個按鈕,可以啓用對等設備的不同功能。存在startActivityForResult調用時的Android程序流控制

Android設備默認情況下未啓用藍牙,並且單擊按鈕後短時間建立連接。

所以,每個按鈕點擊後的流程是:

  1. 確保啓用BT(startActivityForResult()與BT使意圖如果不)
  2. 連接到遠程設備
  3. 使遠程設備的一些功能從設備
  4. 斷開

我的問題是,如果沒有啓用BT,那麼CA將#1中的「startActivityForResult()」改爲「中斷」程序流程。稍後,當調用onActivityResult()時,我想從它被「分解」的點恢復流。

爲此我定義的其他成員字段和一些常數,並用它們在onActivityResult()

private int mRerunMethodIndex = 0; 
private static final int RERUN_METHOD1 = 1; 
private static final inr RERUN_METHOD2 = 2; 
... 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_ENABLE_BT: 
      if (resultCode == Activity.RESULT_OK) { 
       int rerunMethodIndex = mRerunMethodIndex; 
       mRerunMethodIndex = 0; 
       switch (rerunMethodIndex) { 
        case (RERUN_METHOD1): 
         method1(); 
         break; 
        case (RERUN_METHOD2): 
         method2(); 
         break; 
        // ... the same for other cases 
       } 
      } 
      break;  
     default: 
      break; 
    } 
} 

現在,一個更復雜:onActivityResult()會前活動的onResume()調用。如果有任何methodX()需要更改視圖層次結構,這將很重要。在我的情況下,這些方法取代了一些碎片,如果從onActivityResult()執行該操作,則拋出異常。

爲了解決這個額外的問題,難看的switchonActivityResult()遷移到onPostResume()

上述作品描述的方法,但它是我曾經寫過的代碼的最醜陋的作品之一:methodX()「寄存」本身「重播」通過後分配RERUN_METHOD_X常數mRerunMethodIndexonActivityResults()集的一些「重播標誌」 BT啓用,onPostResume()檢查標誌,清除此標誌,清除mRerunMethodIndex並重新運行相應的methodX()

有沒有更優雅的方法(最好限於1或2種方法)?

回答

3

您可以使用runnable來組織工作流程而不使用步常數。例如:

public void Runnable mMethod1 = new Runnable() { 
    public void run() { 
     // your code for method 1 
    } 
} 

public void Runnable mMethod2 = new Runnable() { 
    public void run() { 
     // your code for method 2 
    } 
} 

public void Runnable mMethod3 = new Runnable() { 
    public void run() { 
     // your code for method 3 
    } 
} 

private void startMethod(Runnable method) { 
    mCurrentMethod = method; 
    method.run(); 
} 

... 

public vond onPostResume() { 
    if (mCurrentMethod != null) { 
     mCurrentMethod.run(); 
     mCurrentMethod = null; 
    } 
} 
+0

看起來像命令設計模式的一些變化。我不完全確定這種方法會簡化代碼,但確實很有趣。我會在下次進入這種情況時嘗試看看它是如何工作的。 – Vasiliy

相關問題