Domanda

Sono di fronte il problema con la visualizzazione progressbar onItem selezionato nel menu delle opzioni. Il mio codice è qui:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

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

Progressbar viene visualizzato dopo il completamento del metodo IsLogged.

È stato utile?

Soluzione

si sta chiamando get() subito dopo la AsyncTask come un comportamento asincrono eseguito e perdere perché questo metodo attende fino compito è finito. Si dovrebbe aggiungere tutto il codice nel blocco try / catch per il metodo AsyncTask.onPostExecute() e anche chiudere la finestra da questo metodo.

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

E non credo che è necessario inviare i messaggi al gestore. Il dispatchLogoutFinished() viene eseguito sul thread UI, quindi non c'è necessità di sincronizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top