Search code examples
javaandroidandroid-activityloadingsetcontentview

Android setContentView on pretty short Activity life time


The first activity of my android app, the "launcher activity", finishes pretty quickly. It's goal is to redirect to the MainActivity or to the UserLoginActivity, depending on the value of a shared-preferences variable.

If this variable does not exist, it automatically perform a StartActivity to the MainActivity. If this variable is set, then it will perform an HTTP request to my API, in order to Authenticate the user. Then it will start the MainActivity. The HTTP request usually takes less than one second.

The thing is that I would like to display a progress bar, in the center of the LauncherActivity, so the user can understand that something is loading. The problem is that nothing is displayed on the screen. But if I comment the line that starts the activity, then it will be displayed... It seems that the activity duration is too fast to display anything !

I thought calling the setContentView() method will instantly load Views on the screen. Is my case a normal behavior ? How could I display a progress bar on the screen, knowing that the activity will last around one second ?

Here you can see my Launcher Activity

public class Launcher extends Activity {

    private void goToUserLogin(){

        Intent intent;

        intent = new Intent(this, UserLoginActivity.class);
        startActivity(intent);
        finish();
    }

    private void goToMain(){

        YokiAPI API = new YokiAPI(this);
        Intent      intent;

        try {
            if (API.authenticateSmart(YokiGlobals.preferences.getSavedUserId(this))) {
                intent = new Intent(this, MainActivity.class);
                startActivity(intent);
                finish();
            } else {
                this.goToUserLogin();
            }
       } catch (Exception e){}
    }

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

        // Launch Demo if First Run
        if (YokiGlobals.preferences.getFirstLaunch(this)){
            YokiGlobals.preferences.updateFirstLaunch(false, this);
            this.launchDemo();
        }


        /*
        ** If userId saved, smart Auth and go to Main
        ** Else go to User Login for Full Auth or register
         */

        if (YokiGlobals.preferences.getSavedUserId(this) == null){
            this.goToUserLogin();
        }
        else {
            this.goToMain();
        }
    }
}

And the .xml ressource file

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="THIS TEXT WONT APPEAR"
        android:layout_marginTop="208dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

Thanks, Oscar


Solution

  • I thought calling the setContentView() method will instantly load Views on the screen

    No it won't because you are still in onCreate(). If you want to see any UI you need to let the activity cycle to go further, so rework your code or move your authentication to separate activity, meybe?

    PS: you use this. without any real reason.