Question

Je suis face à la question avec l'affichage onItem progressbar sélectionné dans le menu d'options. Mon code est ici:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

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

Progressbar est affichée après la fin du procédé IsLogged.

Était-ce utile?

La solution

Vous appelez à droite get() après la AsyncTask comme exécuté et lose comportement asynchrone car cette méthode attend jusqu'à ce que la tâche est terminée. Vous devez ajouter tout le code dans bloc try / catch à la méthode de AsyncTask.onPostExecute() et de rejeter également la boîte de dialogue de cette méthode.

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

Et je ne pense pas que vous avez besoin d'envoyer des messages au gestionnaire. Le dispatchLogoutFinished() est exécuté sur le thread d'interface utilisateur, donc il n'y a pas besoin de synchronisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top