Android setContentView на довольно короткое время активности

Первое действие моего приложения для Android, "Активность запуска", заканчивается довольно быстро. Его целью является перенаправление на MainActivity или UserLoginActivity, в зависимости от значения переменной shared -ference.

Если эта переменная не существует, она автоматически выполняет StartActivity с MainActivity. Если эта переменная установлена, то она выполнит HTTP-запрос к моему API, чтобы аутентифицировать пользователя. Затем он запустит MainActivity. HTTP-запрос обычно занимает менее одной секунды.

Дело в том, что я хотел бы отобразить индикатор выполнения в центре LauncherActivity, чтобы пользователь мог понять, что что-то загружается. Проблема в том, что на экране ничего не отображается. Но если я прокомментирую строку, которая запускает действие, то оно будет отображаться... Кажется, что продолжительность действия слишком мала, чтобы что-либо отобразить!

Я думал, что вызов метода setContentView() мгновенно загрузит представления на экране. Является ли мой случай нормальным поведением? Как я могу отобразить индикатор выполнения на экране, зная, что действие будет длиться около одной секунды?

Здесь вы можете увидеть мою активность Launcher

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

И.xml файл ресурсов

<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>

Спасибо оскар

2 ответа

Решение

Я думал, что вызов метода setContentView() мгновенно загрузит представления на экране

Нет, не будет, потому что вы все еще в onCreate(), Если вы хотите увидеть какой-либо пользовательский интерфейс, вам нужно позволить циклу активности идти дальше, так что переделайте свой код или перенесите аутентификацию на отдельное действие, meybe?

PS: вы используете this. без какой-либо реальной причины.

Спасибо за помощь. Я использовал AsyncTask для получения данных из API. Основной поток пользовательского интерфейса теперь может загружать представление.

Вот очень упрощенный код, который может помочь другим.

public class UserSmartAuthActivity extends Activity {

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

    new SmartAuth().execute();
}

private class SmartAuth extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        Context context = getApplicationContext();
        YokiAPI API = new YokiAPI(context);
        Intent intent = null;

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

}

Другие вопросы по тегам