Показывать диалог при получении авторизационного токена для аккаунта Android - PullRequest
1 голос
/ 29 ноября 2011

Я решил показать диалоговое окно с сообщением «Авторизация», когда мое приложение извлекает токен авторизации для учетной записи Google из диспетчера учетных записей, затем я хочу обновить диалоговое окно с установкой сообщения «Сохранить контакты» и в это время выполнить длительную операцию сохранения контактов., но когда я пытаюсь сделать это, как в коде ниже, мое диалоговое окно аутентификации не отображается (требуется 8 секунд черного экрана, затем диалоговое окно появляется на одну секунду и закрывается). Я создаю и обновляю диалог в потоке обработчика, которыйэто привязка к потоку пользовательского интерфейса (создать обработчик в методе onCreate). Похоже, поток пользовательского интерфейса заблокирован при создании диалога. Спасибо.Это мой код:

public void gotAccount(final GoogleAccountManager googleAccountManager,
        final Account account)
{

    SharedPreferences settings = getSharedPreferences(PREF, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("accountName", account.name);
    editor.commit();
    Log.i("gotAccount","start new thread");

    new Thread(new Runnable()
    {

        public void run()
        {
            Log.i("gotAccount-Thread run()","start show loading message");
            createLoadingMessage();
            Log.i("gotAccount-Thread run()","complete show loading message");
            Log.i("gotAccount-Thread run()","start getAuthToken");
            googleAccountManager.manager
            .getAuthToken(account, AUTH_TOKEN_TYPE, true, new AccountManagerCallback<Bundle>()
            {

                @Override
                public void run(AccountManagerFuture<Bundle> future)
                {
                    try
                    {
                        Log.i("gotAccount-run()","get auth token complete");
                        Log.i("callback-run()","start get result");
                        Bundle bundle = future.getResult();

                        if (bundle.containsKey(AccountManager.KEY_INTENT))
                        {
                            Intent intent = bundle
                                    .getParcelable(AccountManager.KEY_INTENT);
                            int flags = intent.getFlags();
                            flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK;
                            intent.setFlags(flags);
                            startActivityForResult(intent, REQUEST_AUTHENTICATE);

                        } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN))
                        {
                            createSaveContactsMessage();

                            setAuthToken(bundle
                                    .getString(AccountManager.KEY_AUTHTOKEN));

                            longOperation();
                            completeSave(getText(R.string.saved) + ": "
                                    + currentCount);

                        }
                    } catch (Exception e)
                    {
                        handleException(e);
                    }
                }

            },null);
        }
    }).start();
}

1 Ответ

0 голосов
/ 29 ноября 2011

Существует более простой способ работы с потоками.Как, например, AsyncTask, где вы определяете свой индикатор выполнения в preExecute (), делаете вещи, которые нужно сделать doInBackground (), и удаляете диалог в onPostExecute ().

Подробнее о асинхронное задание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...