0

オプションメニューで選択されたプログレスバーonItemを表示するという問題に直面しています。私のコードはここにあります:

case R.id.mnuLogout:

                showDialog(Constants.PROGRESS_DIALOG);
                closeOptionsMenu(); 

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

IsLogged メソッドの完了後にプログレスバーが表示されます。

4

1 に答える 1

1

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()UI スレッドで実行されるため、同期の必要はありません。

于 2011-06-12T06:03:09.270 に答える