2012-05-18 39 views
14

我正在使用AccountManager來存儲帳戶&憑據的Android應用程序的工作。我遇到的一個問題是,即使我將一堆字符串值傳遞給AccountManager的addAccountExplyly數據包。AccountManager getUserData儘管設置爲空,但返回null

我已經檢查,以確保該包是不是空,它含有添加帳戶之前值。大多數情況下都是這樣,但每隔一段時間,當我查詢這些值時,我都會得到空值。

我剛剛刪除帳戶並重新添加它後,返回空值更常見。

我做我的查詢裏面的onAccountsUpdated的OnAccountsUpdateListener實施方法,因此客戶應加好走,對不對?

感謝所有幫助

AuthenticatorActivity

// in the AuthenticatorActivity 
Bundle userData = new Bundle(); 
userData.put (k1, v1); 
userData.put (k2, v2); 
userData.put (k3, v3); 
userData.put (k4, v4); 
userData.put (k1, v1); 

Account a = new Account ("acc name", "com.account.type"); 
AccountManager am = AccountManager.get(this); 

OnAccountsUpdateListener listener = new OnAccountsUpdateListener() { 

     @Override 
     public void onAccountsUpdated(Account[] accounts) { 
      Account mine = findAccount(accounts, account); // match account name 
      notifySignedIn(mine); // tell the world you're signed in 
      am.removeOnAccountsUpdatedListener(this); 
     } 
    }; 

am.addOnAccountsUpdatedListener(listener, handler, false); 
am.addAccountExplicitly(a, "themostsecurepwintheworld", userData); 

其他某些線程

AccountManager am = AccountManager.get(mContext); 
final string value2 = am.getUserData(mAccount, k2); 

if (TextUtils.isEmpty(value2)) { 
    Log.d("WTF", "value is empty"); 
} 
+1

一些代碼請。 – kichik

+0

有太多的代碼複製+ pase,但我會用一些基本代碼編輯問題。有很多併發和線程,但一切都是通過_onAccountsUpdatedListener_啓動的。 – copolii

回答

8

我知道在蜂巢一個錯誤的加,可能會導致您的問題。如果您在註冊之前嘗試獲取帳戶的用戶數據,則所有後續的getUserData調用都將返回空值。

如果你看看代碼。 AccountManager有一個由sqlite數據庫支持的內存中緩存。即使未註冊,調用getUserData也會填充內存中的緩存userdata。如果它未被註冊,則將其解釋爲不是用戶數據。註冊帳戶只填充數據庫,不會使內存存儲失效。

這可能會導致您的問題。

解決方法是在調用addAccountExplicitly之前刪除該帳戶。

這個問題很糟糕,並且是AccountManger IMO中的一個巨大錯誤,它允許第三方將您的應用程序本質化爲DOS。

+0

謝謝。我已經重新設計了代碼來解決它,但是如果我沒有記錯的話,它已經發生在預蜂窩設備以及ICS設備上(Nexus 1,Nexus S,HTC Evo,三星Skyrocket以及一些更多)。 – copolii

+0

嗨,你是怎麼編碼的? – fr1550n

+0

在調用addAccountExplicitly之前,在您的賬戶上調用removeAccount。在調用getUserData之前還要檢查該帳戶是否存在 – Bishnu

3

您是否使用了Android 4的HTC設備?我從我的同步應用程序的用戶那裏獲得了有關此問題的很多報告全部其中使用了SDK級別爲15的HTC設備。

對我來說看起來像一個HTC bug。

幾位用戶報告說,重新啓動後問題消失。

更新:同時,我們找到了一個合適的解決方法,請參閱https://stackoverflow.com/a/29776224/1558654

+0

早期AccountsMangers天真地支持一個SQLite數據庫(所有調用從磁盤讀取)。這在HoneyComb中進行了更改,但內存緩存中存在錯誤。重新啓動設備會清除內存中的緩存,並讓設備從磁盤讀取數據(因此也是用戶設置的原始用戶數據)。 – Bishnu

+0

我收到了來自HTC用戶的約25份關於此問題的報告以及非HTC用戶的** no **報告。這聽起來不像是巧合。 – Marten

+0

這不僅限於HTC設備。我的主要測試設備是運行2.3.7,CM7,4.0.4和CM9的Nexus S。它確實發生在其他設備上的不同程度。 – copolii

0

我有類似的問題,但我的問題竟然是試圖存儲一個長的userData值而不是一個字符串。將我的long轉換爲一個字符串進行存儲,並在將它拉出時再解析爲一個long對我來說是個訣竅。

相關問題