存在 startActivityForResult 调用的 Android 程序流控制



问题的程序在Android上运行时,控制从蓝牙(BT)设备。它有几个按钮,可以实现对等设备的不同功能。

默认情况下,Android 设备上未启用蓝牙,并且在单击按钮后会短时间建立连接。

因此,每次单击按钮后的流程为:

  1. 确保启用BT(如果没有,则startActivityForResult()启用BT的意图)
  2. 连接到远程设备
  3. 启用远程设备的某些功能
  4. 断开与设备的连接

我的问题是,如果未启用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()将在活动onResume()之前调用。如果任何methodX()需要更改视图层次结构,这将很重要。在我的情况下,这些方法替换了一些片段,如果此操作是从onActivityResult()执行的,则会引发异常。

为了解决这个额外的问题,丑陋的switchonActivityResult()迁移到onPostResume()

上面描述的方法有效,但它是我写过的最丑陋的代码之一:methodX()通过将常量分配给mRerunMethodIndex来"注册"自己"重新运行"RERUN_METHOD_XonActivityResults()启用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;
    }
}

相关内容

  • 没有找到相关文章

最新更新