Vas*_*liy 8 android event-handling android-activity
有问题的程序在Android上运行时控制从属蓝牙(BT)设备.它具有几个按钮,可以启用对等设备的不同功能.
默认情况下,Android设备上未启用蓝牙,并且在按钮单击后短时间内建立连接.
因此,每次点击按钮后的流程为:
startActivityForResult()
如果没有BT启用意图)我的问题是,如果没有启用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;
}
}
Run Code Online (Sandbox Code Playgroud)
现在,还有一个复杂问题:onActivityResult()
将在活动之前调用onResume()
.如果methodX()
需要更改视图层次结构,这将很重要.在我的情况下,这些方法替换了一些Fragments,如果执行此操作,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;
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
362 次 |
最近记录: |