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

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

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

  • 确保启用了BT(如果未启用,则使用BT启用 Intent 的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/

    10-12 03:31