Java Oncreate在显示活动之前等待所有方法的完成

Java Oncreate在显示活动之前等待所有方法的完成,java,android,android-studio,java-threads,Java,Android,Android Studio,Java Threads,我正在尝试为我的android应用程序显示一个简介,初始化此简介的方法是从主活动的onCreate()方法调用的,当我在显示简介活动的方法上设置断点时进行调试,在我的设备中显示主活动 有什么办法可以防止这种情况发生吗 主要活动: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { validateFirst

我正在尝试为我的android应用程序显示一个简介,初始化此简介的方法是从主活动的
onCreate()
方法调用的,当我在显示简介活动的方法上设置断点时进行调试,在我的设备中显示主活动

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

主要活动:

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语句中, 在恢复断点之前,活动已显示在te设备中


为什么?

这是因为
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);
  }
}
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;
}
@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);
    }
}
然后在
onCreate()
中,您可以使用:

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

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

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);
  }
}
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;
}
@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);
    }
}
然后,您可以使用
onCreate
中的方法进行如下操作:

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);
  }
}
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;
}
@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);
    }
}