该程序在Android上运行时,可控制从属蓝牙(BT)设备。它只有很少的按钮可以启用对等设备的不同功能。
默认情况下,Android设备上未启用蓝牙功能,并且在单击按钮后的短时间内建立了连接。
因此,单击每个按钮后的流程为:
startActivityForResult()
)我的问题是,如果未启用BT,则对#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()
将在 Activity 的onResume()
之前调用。如果任何methodX()
需要更改 View 层次结构,这将很重要。在我的情况下,这些方法替换了一些Fragments,如果从onActivityResult()
执行此操作,则会引发异常。为了解决此其他问题,
switch
中的丑陋onActivityResult()
迁移到onPostResume()
。上述方法行之有效,但这是我编写过的最丑陋的代码之一:
methodX()
通过将RERUN_METHOD_X
常量分配给mRerunMethodIndex
来“注册”自身以进行“重新运行”,启用BT后,onActivityResults()
设置一些“重新运行标志”, onPostResume()
检查该标志,清除此标志,清除mRerunMethodIndex
并重新运行适当的methodX()
。有没有更优雅的方法(最好限于一种或两种方法)?
最佳答案
您可以使用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/