Прогнозируется дисплей с некоторой задержкой в меню «Нажмите на опцион»
-
27-10-2019 - |
Вопрос
Я сталкиваюсь с проблемой с отображением ProgressBar Onitem, выбранного в меню опциона. Мой код здесь:
case R.id.mnuLogout:
showDialog(Constants.PROGRESS_DIALOG);
closeOptionsMenu();
if(MyApp.IsLoggedOut())
handler.sendEmptyMessage(Constants.LOGOUT);
else
handler.sendEmptyMessage(Constants.ERROR_MSG);
ProgressBar отображается после завершения метода IsLogged.
Решение
Вы звоните get()
сразу после AsyncTask
как выполнено и теряет асинхронное поведение, потому что этот метод ждет, пока задача не будет завершена. Вы должны добавить весь код в блоке Try/ AsyncTask.onPostExecute()
Метод, а также отклоните диалог из этого метода.
void doLogout() {
new LogoutTask().execute();
}
void dispatchLogoutFinished() {
dismissDialog(Constants.PROGRESS_DIALOG);
if (MyApp.IsLoggedOut()) {
// do something
} else {
// do something else
}
}
private class LogoutTask extends AsyncTask<Void, Void, Void> {
protected void onPreExecute() {
TheActivity.this.showDialog(Constants.PROGRESS_DIALOG);
}
protected Void doInBackground(Void... params) {
return null;
}
protected void onPostExecute(Long result) {
TheActivity.this.dispatchLogoutFinished();
}
}
И я не думаю, что вам нужно отправлять сообщения в обработчик. А dispatchLogoutFinished()
выполняется в потоке пользовательского интерфейса, поэтому нет необходимости в синхронизации.
Не связан с StackOverflow