【问题标题】:Is GoogleAuthUtil.getToken() thread safe?GoogleAuthUtil.getToken() 线程安全吗?
【发布时间】:2013-09-24 11:49:42
【问题描述】:

在我阅读了Verifying Back-End Calls from Android Apps (http://android-developers.blogspot.tw/2013/01/verifying-back-end-calls-from-android.html) 之后,我还阅读了Google Play services and OAuth Identity Tools (http://android-developers.blogspot.tw/2012/09/google-play-services-and-oauth-identity.html),上面写着

“您应该在每组 GET 或 POST 之前调用 GoogleAuthUtil.getToken() 以获取令牌;适当地缓存内容以及处理令牌到期和刷新是很聪明的。”

读完这句话,我有三个问题。

  1. 因为在每组GET或者POST之前需要调用GoogleAuthUtil.getToken()来获取token,所以想知道GoogleAuthUtil.getToken()是不是线程安全的。

假设一个场景,我需要在后台定期与我的服务器同步。每次我通过一组 HTTP 请求与我的服务器联系之前,我需要调用 GoogleAuthUtil.getToken() 以便可以使用有效令牌发送请求。

另一方面,当用户与我的应用程序交互时,我也需要做同样的事情:调用GoogleAuthUtil.getToken() 来获取令牌并将其与一组 HTTP 请求一起发送到我的服务器。因为用户可能会在后台同步进行时与应用程序交互,所以GoogleAuthUtil.getToken() 可能会同时在两个不同的线程中被调用。因此,我想知道 getToken() 是否是线程安全的。

2.有没有办法可以获取令牌到期时间,以便我可以缓存令牌?我查了文档(http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html)没有这样的方法。

3.我应该刷新GoogleAuthUtil.getToken()返回的令牌吗?如果是,有没有办法做到这一点?或者,每次需要有效令牌时我是否应该致电GoogleAuthUtil.getToken()

【问题讨论】:

    标签: android multithreading google-oauth google-play-services


    【解决方案1】:
    1. 我不会担心线程安全性。我试图思考线程冲突会导致什么问题,但没有想到任何事情。

    2 & 3。找到令牌到期时间的唯一记录方法是点击 tokeninfo 端点,但我认为您不想为此添加 HTTP 往返。我认为聪明的事情就是继续调用 getToken() ,它会确保你得到的东西足够长,可以派上用场。它会根据需要刷新,因此您不必这样做。

    【讨论】:

    • “线程冲突”是否意味着我们不能同时从不同的线程调用 GoogleAuthUtil.getToken()?
    • 基本上 GoogleAuthUtil.getToken() 为您实现缓存策略。它已经持有令牌,直到令牌即将到期。当令牌过期或几乎过期时,它将请求一个新的令牌。如果您在两个线程中并行请求 getToken(),那么最糟糕的情况是您发出两个并行令牌请求。其中一个响应将被缓存。
    猜你喜欢
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    • 2021-08-03
    • 2010-12-27
    • 2018-06-04
    相关资源
    最近更新 更多