有问题的程序在
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().
解决方法
您可以使用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; } }