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