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

相关问题