簡體   English   中英

使用CountdownLatch從accountmanager獲取Auth令牌

[英]Getting an Auth Token from accountmanager using a CountdownLatch

在嘗試向服務器發出請求之前,我試圖從Android中的帳戶獲取身份驗證令牌。 我正在嘗試使用CountdownLatch控制流,以使其等待直到:

  • a)超時(10秒)
  • b)我們獲得令牌

     private CountDownLatch tokenLatch = new CountDownLatch(1); final long tokenTimeoutSeconds = 10; AccountManager manager = AccountManager.get(mContext); Account userAccount = getCurrentAccount(); // Get the auth token if (userAccount != null) { AccountManagerFuture<Bundle> future = manager.getAuthToken(userAccount, AccountUtility.AUTHTOKEN_TYPE_FULL_ACCESS, true, new AccountManagerCallback<Bundle>() { @Override public void run(AccountManagerFuture<Bundle> future) { try { Bundle bundle = future.getResult(); currentAuthToken = bundle.get(AccountManager.KEY_AUTHTOKEN).toString(); tokenLatch.countDown(); } catch (Exception e) { Log.e(LOG_TAG, "Problem getting auth token!", e); } } }, null); try { tokenLatch.await(tokenTimeoutSeconds, TimeUnit.SECONDS); } catch (InterruptedException e) { Log.e(LOG_TAG, "Interupted while getting auth token!", e); } 

上下文已傳遞:

mContext = ...  getApplicationContext();

現在,它在這兩種情況中的任何一種之前退出。 但是,在所有其他過程完成后,它始終始終到達AccountManagerCallback。 奇怪。 我絕對是在做錯什么。 感謝您的幫助!

該解釋假定發布的代碼在主線程上運行。 因為對getAuthToken()的調用中的Handler參數為null,所以回調也將在主線程上運行。 這是一個僵局。 調用getAuthToken()之后,主線程在閂鎖await()上阻塞。 由於主線程被阻塞,所以回調無法運行。 鎖存器永遠不會倒計數到零,因為回調無法運行。

在此博客上發布的代碼提供了一個示例,說明如何在不阻塞的情況下在主線程上獲取auth令牌。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM