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性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...