AccountManager blockingGetAuthToken застревает - PullRequest
2 голосов
/ 25 мая 2011

Я использовал SampleSyncAdapter в качестве базы для создания своего собственного SyncAdapter.Кажется, это хорошо работает для добавления новой учетной записи, но как только я хочу получить авторизацию с помощью AccountManager.blockingGetAuthToken (... она застревает, а затем выдает исключение OperarationCanceledException через несколько минут.

Есть ли у кого-нибудьИдея, что здесь может быть не так? Код почти такой же, как в примере, за исключением того, что я аутентифицируюсь на своем собственном сервере.

05-24 23: 00: 23.258: ОШИБКА / SyncAdapter (4961): OperationCanceledExcetpion 05-24 23: 00: 23.258: ОШИБКА / SyncAdapter (4961): android.accounts.OperationCanceledException 05-24 23: 00: 23.258: ОШИБКА / SyncAdapter (4961): в android.accounts.AccountManager $ AmsTask.internalGetResult (AccountManager.j: 1255) 05-24 23: 00: 23.258: ОШИБКА / SyncAdapter (4961): at android.accounts.AccountManager $ AmsTask.getResult (AccountManager.java:1260) 05-24 23: 00: 23.258: ОШИБКА / SyncAdapter (4961)): в android.accounts.AccountManager $ AmsTask.getResult (AccountManager.java:1181) 05-24 23: 00: 23.258: ОШИБКА / SyncAdapter (4961): в android.accounts.AccountManager.blockingGetAuthToken (AccountManager.java:737)

Ответы [ 2 ]

2 голосов
/ 25 мая 2011

Метод blockingGetAuthToken - это помощник, который синхронно вызывает getAuthToken.

Если вы обращаетесь к сети для получения токена аутентификации, вы будете заблокированы, пока запрос не будет выполнен успешно. Вы должны убедиться, что вы можете получить доступ к сетевому ресурсу должным образом из вашего приложения.

0 голосов
/ 20 сентября 2014

Первоначально метод - это удобный способ получить авторизацию вместо вызова метода getAuthToken нужно убедиться, что нет в mainthread, вызвав methed runOnUIthread. или вы можете вызвать метод по умолчанию getAuthToken и использовать обратный вызов для выполнения следующей инструкции. для примера.

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, AccountConfig.AUTHTOKEN_TYPE, null, this, null, null);
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {

                Bundle bnd = future.getResult();
                final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN); 
                if (authtoken == null) { 
                    return;
                }
                 // this callback interface method 
                logoutCallback.onLogoutFinished(authtoken);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
...