1

我有一个 Android 项目,在其中我从服务器获取令牌进行身份验证,并将其用于对服务器的进一步查询。令牌大约在 10 分钟后过期,所以我必须获取一个新令牌。我现在的模式是这样的:

1-在用户首次启动应用程序时获取令牌

2-使用“请稍候”对话框阻止用户输入,这样他就不会尝试使用来自其他活动的空令牌发送查询

3-保存令牌和时间戳,停止阻止用户输入

4-定期检查onCreate()活动方法中的时间戳

5-必要时更新。

我的问题是这个;如果用户打开一个活动并且令牌已过期,我的应用程序会再次阻止用户输入并尝试获取令牌。但是,在后台,应用程序的正常逻辑/流程继续,并尝试使用旧令牌或空令牌向服务器发送查询。

所以我想阻止这个查询任务 - 这AsyncTask类似于令牌获取 - 并在令牌获取完成后启动它。我如何使用这种模式,这是一个正确的模式吗?

让一个线程等待另一个线程完成?

4

1 回答 1

1

我会考虑使用带有自定义身份验证器的 Android 帐户管理器来处理令牌。SampleSyncAdapter向您展示了如何进行。使用AccountManager的 getAuthToken 获取当前令牌。在身份验证器中,您可以包含在超时时使令牌无效的逻辑,这将导致身份验证器在下一次请求令牌时联系服务器。

但我想你的项目实现它的开销可能太大了。对于您当前的设置,我看到了两种方法:

  1. 也许您可以尝试简单地取消当前查询并在检索到新令牌后触发新查询?
  2. 使用Java 同步原语进行阻塞。例如,创建一个“锁定”对象并在异步任务和更新令牌的地方使用它:

    protected Result doInBackground(Params... params) {
        //
        // the request and other stuff that does not require the token.
    
        synchronized(lock) {
            //
            // communicate with the server.
        }
    }
    
于 2012-05-25T07:19:14.707 回答