在Android上運行時,有問題的程序控制從屬藍牙(BT)設備。它具有幾個按鈕,可以啓用對等設備的不同功能。存在startActivityForResult調用時的Android程序流控制
Android設備默認情況下未啓用藍牙,並且單擊按鈕後短時間建立連接。
所以,每個按鈕點擊後的流程是:
- 確保啓用BT(
startActivityForResult()
與BT使意圖如果不) - 連接到遠程設備
- 使遠程設備的一些功能從設備
- 斷開
我的問題是,如果沒有啓用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()
執行該操作,則拋出異常。
爲了解決這個額外的問題,難看的switch
從onActivityResult()
遷移到onPostResume()
。
上述作品描述的方法,但它是我曾經寫過的代碼的最醜陋的作品之一:methodX()
「寄存」本身「重播」通過後分配RERUN_METHOD_X
常數mRerunMethodIndex
,onActivityResults()
集的一些「重播標誌」 BT啓用,onPostResume()
檢查標誌,清除此標誌,清除mRerunMethodIndex
並重新運行相應的methodX()
。
有沒有更優雅的方法(最好限於1或2種方法)?
看起來像命令設計模式的一些變化。我不完全確定這種方法會簡化代碼,但確實很有趣。我會在下次進入這種情況時嘗試看看它是如何工作的。 – Vasiliy