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

标签 android android-activity event-handling

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

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

所以,每次点击按钮后的流程是:

  1. 确保启用 BT(startActivityForResult() 如果未启用 BT Intent )
  2. 连接到远程设备
  3. 启用远程设备的一些功能
  4. 断开与设备的连接

我的问题是,如果未启用 BT,则调用 startActivityForResult()在 #1 中“中断”了程序流程。后来,当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 层次结构。在我的例子中,这些方法替换了一些 fragment ,如果这个操作是从 onActivityResult() 执行的然后抛出异常。

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

关于存在 startActivityForResult 调用的 Android 程序流控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27973960/

相关文章:

android - 在 ionic real android 设备中从本地服务器测试 REST API

java - 运行 "sonar-scanner"命令时出现 SonarQube 扫描仪错误

java - Android 在一个 Activity 上只运行一次类

event-handling - 为长轮询发出用户特定的事件

javascript - onkeypress vs oninput 如何两全其美

android - 使用支持操作栏主页已启用

java - Android:如何通过按钮启动 Activity ?

java.lang.IllegalStateException : Could not execute method of the activity, 如何解决?

java - SmartGWT:从列表网格中选定的记录打开窗口

android - 在 ListView 中最右边对齐复选框