gpt4 book ai didi

java - Oncreate 在显示 Activity 之前等待所有方法完成

转载 作者:行者123 更新时间:2023-12-02 11:24:03 24 4
gpt4 key购买 nike

我正在尝试显示我的 andorid 应用程序的介绍,初始化此介绍的方法是从主 Activity 的 onCreate() 方法中调用的,当我中断时进行调试指向显示介绍 Activity 的方法,在我的设备中显示主要 Activity 。

有什么办法可以防止这种情况发生吗?

主要 Activity :

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
validateFirstTime();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

private void validateFirstTime() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
// Initialize SharedPreferences
SharedPreferences getPrefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());

// Create a new boolean and preference and set it to true
boolean isFirstStart = getPrefs.getBoolean("firstStart", true);

// If the activity has never started before...
if (isFirstStart) {

// Launch app intro
final Intent i = new Intent(MainActivity.this, IntroActivity.class);

runOnUiThread(new Runnable() {
@Override
public void run() {
startActivity(i);
}
});

// Make a new preferences editor
SharedPreferences.Editor e = getPrefs.edit();

// Edit preference to make it false because we don't want this to run again
e.putBoolean("firstStart", true);

// Apply changes
e.apply();
}
}
});
// Start the thread
t.start();
}

我将断点放在 validateFirstTime() 方法的 if 语句中,在恢复断点之前, Activity 已显示在设备中。

为什么?

最佳答案

这是因为 validateFirstTime() 中的代码与以下代码在不同的线程上运行:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

它在主线程上运行。

您可以通过将代码移出线程来解决问题,如下所示:

private void validateFirstTime() {
SharedPreferences getPrefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());

// Create a new boolean and preference and set it to true
boolean isFirstStart = getPrefs.getBoolean("firstStart", true);

// If the activity has never started before...
if (isFirstStart) {

// Launch app intro
Intent i = new Intent(MainActivity.this, IntroActivity.class);
startActivity(i);

// Make a new preferences editor
SharedPreferences.Editor e = getPrefs.edit();

// Edit preference to make it false because we don't want this to run again
e.putBoolean("firstStart", false);

// Apply changes
e.apply();
} else {
setContentView(R.layout.activity_main);
}
}

然后在onCreate()中你可以使用这个:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
validateFirstTime();
}
<小时/>

或者,您可以使用更简单的方法,将第一次的所有检查移至如下方法:

private boolean isFirstTimeUsage() {
SharedPreferences getPrefs = PreferenceManager
.getDefaultSharedPreferences(getBaseContext());

// Create a new boolean and preference and set it to true
boolean isFirstStart = getPrefs.getBoolean("firstStart", true);

// If the activity has never started before...
if (isFirstStart) {
// Make a new preferences editor
SharedPreferences.Editor e = getPrefs.edit();

// Edit preference to make it false because we don't want this to run again
e.putBoolean("firstStart", false);

// Apply changes
e.apply();
}

return isFirstStart;
}

然后您可以使用 onCreate 中的方法,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

boolean isFirstTime = isFirstTimeUsage();
if(isFirstTime) {
// Launch app intro
Intent i = new Intent(MainActivity.this, IntroActivity.class);
startActivity(i);
} else {
setContentView(R.layout.activity_main);
}
}

关于java - Oncreate 在显示 Activity 之前等待所有方法完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49724548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com