Отображение ProgressBar с некоторой задержкой при нажатии на меню параметров - PullRequest
0 голосов
/ 12 июня 2011

У меня проблема с отображением индикатора выполнения на элементе, выбранном в меню параметров. Мой код здесь:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

                             if(MyApp.IsLoggedOut())
                    handler.sendEmptyMessage(Constants.LOGOUT);
                 else
                        handler.sendEmptyMessage(Constants.ERROR_MSG);  

Индикатор выполнения отображается после завершения метода IsLogged.

1 Ответ

1 голос
/ 12 июня 2011

Вы вызываете get() сразу после AsyncTask как выполненное и теряете асинхронное поведение, потому что этот метод ожидает, пока задача не будет завершена. Вы должны добавить весь код блока try / catch в метод 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() выполняется в потоке пользовательского интерфейса, поэтому синхронизация не требуется.

...