我正在努力弄清楚如何处理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();
....
答案 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();
}
这样的事情应该有用,我从来没有尝试过。