2010-12-06 93 views
3

我很想弄清楚如何处理Android中代码继续执行的情况,当我真的不想要它时。在一个活动的onCreate()中,我有一些东西需要按顺序执行,并且我不能让代码继续执行,直到某些事情首先发生。我明白,这就是Android和Java的行为方式,我正在努力想出另一种方法来完成我所需要的。我需要Android和Java的帮助

ShowEula是我创建的一个类,用于显示与我的EULA的简单对话。在调用DBGetOnlineVersionNumber()之前,我真的需要等到用户同意或不同意EULA。也许我只是不以正确的方式去做。无论如何,这里是我的代码片段:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.main); 
    String version; 
    ShowEula();  
    version = DBGetOnlineVersionNumber(); 
    .... 

回答

4

您需要重新考虑android所使用的事件驱动模型。

您不能等待onCreate中的UI事件,因为只有在onCreate返回后才能传递UI事件。

也许你可以把事情组织成一个软件状态机。

的onCreate将显示EULA和状态设置为EULA_SHOWING

接受将推进状态,以EULA_ACCEPTED和显示下

当然一些你可能不希望显示EULA在每次启动时,但只能在安装之后,但你可以用设置中存储的东西来处理。

+0

我使用sharedpreferences来处理EULA。我在想你在暗示什么,但我在排序时遇到了麻烦。你是否在建议类似于处理程序?我可以为EULA_SHOWING设置一个状态?你会如何建议我这样做? – 2010-12-06 01:14:08

+0

不,我建议您需要重新考虑您的用户界面编程的全部概念,以便进行事件驱动。系统和用户都会向你发送事件,例如创建或触摸事件,每当你得到一个事件时你都会很快做出一些事情并返回,可能会设置一个状态变量,以便你知道下一步/做什么事情你得到它后。 – 2010-12-06 01:24:25

3

是的,这是一个与所有异步执行操作的GUI有关的问题。我通常做的就是把一个布尔值,在一个共享的偏好,然后在启动创建两个分支...

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.main); 
    String version; 

    if (Settings.isEulaBeenShown() == false) { 
     /* showEula would call stuffToDoIfUserAgreesToEULA on a positive response was given */ 
     ShowEula(); 
    } 
    else if (Settings.isEULAAgreed() == true) { 
     stuffToDoIfUserAgreesToEULA() 
    } 
    .... 
} 

private void stuffToDoIfUserAgreesToEULA() { 
    String version = DBGetOnlineVersionNumber(); 
} 
0

我想你可以创建2个XML布局。

一个用于您的EULA和Accept/Deny按钮,然后是另一个用于您的主应用程序。

当应用程序加载时,您可以只显示EULA布局,如果这是第一次,并且未在共享首选项中进行跟踪。

然后,当用户接受在应用程序内容视图中拥有setContentView时。

从onCreate()中抽取出大部分内容,以便您可以重新使用这些组件。

private static boolean EulaRequired = true; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    EulaRequired = sharedprefs.getBoolean("firsttime", true); 
    inflateLayout();  
} 

private void inflateLayout() { 
    if (EulaRequired) { 
    this.setContentView(R.layout.eula); 
    } else { 
    this.setContentView(R.layout.application); 
    DBGetOnlineVersionNumber(); 
    } 
} 
private void stuffToDoIfUserAgreesToEULA() { 
    String version = DBGetOnlineVersionNumber(); 
} 
void AcceptClicked(Event e) { 
    EulaRequired = false; 
    inflateLayout(); 
} 

这样的事应该工作,我从来没有尝试过。