Отображение ProgressDialog во время перезагрузки контекста Android GL
Я работаю над игрой, которая требует перезагрузки текстур, когда приложение теряет фокус. В течение этого времени приложение не реагирует на действия пользователя.
Я настроил обработчик, чтобы сообщить основному классу Activity, когда текстуры будут загружены, чтобы он мог скрыть ProgressDialog, который я запускаю, когда пользователь покидает приложение, как показано ниже:
@Override
public void onWindowFocusChanged(final boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
if (hasWindowFocus) {
if (this.windowLocked && this.gamePaused) {
this.gamePaused = false;
Cocos2dxHelper.onResume();
this.mGLSurfaceView.onResume();
}
this.windowLocked = false;
} else {
this.windowLocked = true;
}
}
@Override
protected void onResume() {
super.onResume();
if (!this.windowLocked && this.gamePaused) {
this.gamePaused = false;
Cocos2dxHelper.onResume();
this.mGLSurfaceView.onResume();
}
if (!this.dialogShowing && this.gamePaused) {
displayResumingDialog();
}
}
@Override
protected void onPause() {
super.onPause();
this.gamePaused = true;
Cocos2dxHelper.onPause();
this.mGLSurfaceView.onPause();
}
Функции для отображения и скрытия диалога выглядят так:
static public void displayResumingDialog() {
dialogShowing = true;
resumingDialog = ProgressDialog.show(sContext, "Re-Initializing", "Please Wait...", true);
}
static public void hideResumingDialog() {
if (resumingDialog != null && resumingDialog.isShowing()) {
resumingDialog.dismiss();
dialogShowing = false;
}
}
Это работает абсолютно нормально, если пользователь покидает приложение с помощью кнопки "Домой", а затем возвращается, открыв ящик приложений и снова щелкнув значок. Если они блокируют экран и возвращаются, или удерживают кнопку "Домой" и возвращаются из списка запущенных приложений, диалог никогда не будет скрыт. На самом деле все, кроме диалога, перестает работать. Если я настраиваю диалоговое окно так, чтобы оно было закрыто при касании снаружи, и я закрываю его, приложение все еще зависает, пока я не нажму кнопку Назад. Затем через несколько секунд текстуры перезагружаются и начинается игра.
Я сделал немало регистрации, пытаясь понять это. Все вызовы кажутся одинаковыми, за исключением того, что иногда, когда экран заблокирован, onResume вызывается дважды. Я думаю, что мой код объясняет это, хотя. Если я не позволяю ему отображаться, когда экран заблокирован, код проходит до конца без проблем. Когда диалоговое окно открыто, и экран возвращается из заблокированного состояния, код останавливается, как только появляется диалоговое окно, поэтому onSurfaceCreated никогда не вызывается, и текстуры никогда не имеют возможности загружаться. Как я уже сказал, он не возобновится, пока я не закрою диалог и не нажму кнопку возврата.
Что заставило бы ProgessDialog полностью вступить во владение таким образом? Возможно, более важно, почему это происходит при возврате из заблокированного экрана или списка запущенных приложений, но не при нажатии на значок приложения?
1 ответ
Ну, я не хочу отвечать на свой вопрос, но я выяснил проблему и решил, что она может помочь кому-то еще. При создании диалоговое окно фокусируется, поэтому код onWindowFocusChanged никогда не вызывается, поэтому текстуры никогда не перезагружаются. Я исправил это, сделав мой диалог не сфокусированным, вот так:
resumingDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
Хотя диалог блокируется с остальной частью пользовательского интерфейса, если пользователь возвращается с заблокированного экрана, по крайней мере, он там. Я попытался показать диалог в асинхронной задаче, чтобы он вращался, пока остальная часть интерфейса была заблокирована, но не повезло. Если кто-то может сказать мне, как заставить диалог вращаться, я был бы рад наградить ответ этому человеку. Он вращается, если они возвращаются в приложение через список запущенных приложений или значок приложения, но не с заблокированного экрана.