Android程序流控制存在startActivityForResult调用

前端之家收集整理的这篇文章主要介绍了Android程序流控制存在startActivityForResult调用前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
有问题的程序在 Android上运行时控制从属蓝牙(BT)设备.它具有几个按钮,可以启用对等设备的不同功能.

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

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

>确保BT启用(如果没有BT启用意图的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()需要更改视图层次结构,这将很重要.在我的例子中,这些方法替换了一些Fragments,如果从onActivityResult()执行此操作,则抛出异常.

为了解决这个额外的问题,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;
    }
}

猜你在找的Android相关文章