有问题的程序在 Android 上运行时会控制从属蓝牙 (BT) 设备。它有几个按钮,可以启用对等设备的不同功能。
Android 设备默认不启用蓝牙,点击按钮后短时间建立连接。
所以,每次点击按钮后的流程是:
- 确保启用 BT(
startActivityForResult()
如果未启用 BT Intent ) - 连接到远程设备
- 启用远程设备的一些功能
- 断开与设备的连接
我的问题是,如果未启用 BT,则调用 startActivityForResult()
在 #1 中“中断”了程序流程。后来,当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()
将在 Activity 的 onResume()
之前调用.这将很重要,如果任何 methodX()
需要更改 View 层次结构。在我的例子中,这些方法替换了一些 fragment ,如果这个操作是从 onActivityResult()
执行的然后抛出异常。
为了解决这个额外的问题,丑陋的switch
来自 onActivityResult()
迁移到 onPostResume()
.
上述方法可行,但它是我写过的最丑陋的代码之一:methodX()
通过分配 RERUN_METHOD_X
为“重新运行”“注册”自身常数为 mRerunMethodIndex
, onActivityResults()
启用 BT 后设置一些“重新运行标志”,onPostResume()
检查标志,清除此标志,清除 mRerunMethodIndex
并重新运行适当的 methodX()
.
是否有更优雅的方法(最好仅限于 1 或 2 种方法)?
最佳答案
您可以使用 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;
}
}
关于存在 startActivityForResult 调用的 Android 程序流控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973960/