1

我有一個Android項目,我從服務器獲取一個令牌用於身份驗證,並將其用於進一步查詢服務器。令牌大約在10分鐘內過期,因此我必須獲取新的令牌。我現在的模式是這樣的:Android的令牌模式

取令牌當用戶第一次啓動該應用程序有一個「請稍候」的對話框,所以他不會嘗試

2-阻止用戶輸入從其他activites

3-保存令牌和時間戳發送帶有空令牌查詢,停止阻止用戶輸入

4-定期檢查時間戳onCreate()活動方法

5-如有必要,更新。

我的問題是這樣的;如果用戶打開一個活動並且令牌過期,我的應用程序將再次阻止用戶輸入並嘗試獲取該令牌。但是,在後臺,應用程序的普通邏輯/流程會繼續,並嘗試使用舊或空標記向服務器發送查詢。

所以我想阻止這個查詢任務 - 這是一個AsyncTask像令牌獲取 - 並在令牌獲取完成後啓動它。我如何使用這種模式,這是一個正確的嗎?

讓一個線程等待另一個線程完成?

回答

1

我會考慮使用Android帳戶管理器與自定義身份驗證器來處理令牌。 SampleSyncAdapter向您顯示如何繼續。使用AccountManager的getAuthToken獲取當前令牌。在驗證器中,您可以包含邏輯以在超時時使令牌失效,這將導致驗證器在下一個令牌的請求與服務器聯繫。

但我想這可能是太多的開銷爲您的項目來實現這一點。兩種方法我看到您的當前設置:

  1. 也許你可以嘗試簡單地cancel當前的查詢,並觸發一個新的您檢索新的憑證後?
  2. 使用Java synchronization primitives來阻止。例如,創建一個「鎖定」對象,並在異步任務中使用它,在那裏你更新你的令牌:

    protected Result doInBackground(Params... params) { 
        // 
        // the request and other stuff that does not require the token. 
    
        synchronized(lock) { 
         // 
         // communicate with the server. 
        } 
    } 
    
+0

你能提供一個很好的資源對Java併發可能帶有大量的實例研究。我已經多次閱讀官方的Java教程,但我仍然無法很好地理解它。 –

+0

對不起,這就是我正在使用的。可能有關於這個主題的書籍,但我不知道有什麼可以推薦給你的。您也可以在Slideshare上找到一些不錯的幻燈片(http://www.slideshare.net/search/slideshow?searchfrom=header&q=java+concurrency)。 – andyandy

相關問題