Android程序流控制存在startActivityForResult调用

时间:2015-01-15 22:11:43

标签: android android-activity event-handling

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

Android设备默认未启用蓝牙,点击按钮后短时间内建立连接。

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

  1. 确保启用BT(startActivityForResult(),如果没有BT启用意图)
  2. 连接到远程设备
  3. 启用远程设备的某些功能
  4. 与设备断开连接
  5. 我的问题是,如果未启用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()执行此操作,则抛出异常。

    要解决此其他问题,switch中丑陋的onActivityResult()会迁移到onPostResume()

    上述方法有效,但它是我写过的最丑陋的代码之一:methodX()通过将RERUN_METHOD_X常量赋给{{1}来“注册”自身以“重新运行”启用BT后,mRerunMethodIndex设置一些“重新运行标志”,onActivityResults()检查标志,清除此标志,清除onPostResume()并重新运行相应的mRerunMethodIndex

    是否有更优雅的方法(最好只限于1或2种方法)?

1 个答案:

答案 0 :(得分: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;
    }
}