我需要Android和Java的帮助

时间:2010-12-06 01:01:36

标签: java android

我正在努力弄清楚如何处理Android中的情​​况,其中代码在我真的不想要的时候继续执行。在一个活动的onCreate()中,我有一些我需要按顺序完成的东西,我不能让代码继续执行,直到某些事情先发生。我知道这就是Android和Java的行为方式,我正在努力找到另一种方法来实现我的需要。

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

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

3 个答案:

答案 0 :(得分:4)

你需要根据android使用的事件驱动模型来重新思考。

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

也许您可以将事物组织为软件状态机。

onCreate将显示EULA并将状态设置为EULA_SHOWING

接受会将状态推进到EULA_ACCEPTED并显示下一步

当然,您可能不希望在每次启动时显示EULA,但仅在安装后显示,但您可以使用存储在设置中的内容来处理此问题。

答案 1 :(得分: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();
 }

答案 2 :(得分:0)

我认为你可以创建2个xml布局。

一个用于您的EULA和接受/拒绝按钮,然后另一个用于您的主应用程序。

当应用加载时,您可以只显示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();
 }

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