Прогнозируется дисплей с некоторой задержкой в ​​меню «Нажмите на опцион»

StackOverflow https://stackoverflow.com/questions/6320421

Вопрос

Я сталкиваюсь с проблемой с отображением 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() выполняется в потоке пользовательского интерфейса, поэтому нет необходимости в синхронизации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top