2

我一直使用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.java:1255) 05-24 23:00:23.258: 错误/SyncAdapter(4961): 在 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)

4

2 回答 2

2

该方法是一个同步blockingGetAuthToken调用的助手。getAuthToken

如果您正在访问网络以检索身份验证令牌,您将被阻止,直到请求成功。您应该检查您是否可以从应用程序中正确访问网络资源。

于 2011-05-24T23:59:21.127 回答
0

最初方法是获取 authtoken 的便捷方法,而不是调用方法getAuthToken。必须通过调用方法 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();
于 2014-09-20T05:02:16.937 回答