我在我的应用程序中使用Android Async Http Library来进行异步的http请求。
现在我遇到了这样的情况。我的web api使用访问令牌和刷新令牌。在每个请求时,我都会检查访问令牌是否仍然有效。如果无效,则发出一个http post请求,使用刷新令牌获取新的访问令牌。
现在我注意到以下情况。
我的应用程序用户将手机处于非活动状态足够长的时间,以使访问令牌过期。当他们唤醒手机时,在我的onResume()函数中,我会同时发出两个单独的http请求。
1. 请求1检查访问令牌并确定其无效。然后它发出一个refreshAccessToken请求。 2. 当请求1等待响应时,请求2也检查访问令牌并确定其无效。它也发出一个refreshAccessToken请求。 3. 请求1成功返回并更新访问令牌和刷新令牌的值。 4. 然后,请求2从api获得401响应,因为它提供的刷新令牌已被使用。我的应用程序会认为refreshToken存在错误,并注销用户。
这显然是不正确的,我想避免这种情况。与此同时,我在refreshAccessToken onFailed()方法中进行了双重检查,以查看accessToken是否可能再次有效。但是这是低效的,因为我仍然发送了两个请求,并且我的API必须处理刷新失败的尝试。
问题:现在我的问题是我不能使用任何锁或同步,因为您不能阻止Android主UI线程。而Android Async Http Library处理所有不同的线程等。
现在我遇到了这样的情况。我的web api使用访问令牌和刷新令牌。在每个请求时,我都会检查访问令牌是否仍然有效。如果无效,则发出一个http post请求,使用刷新令牌获取新的访问令牌。
现在我注意到以下情况。
我的应用程序用户将手机处于非活动状态足够长的时间,以使访问令牌过期。当他们唤醒手机时,在我的onResume()函数中,我会同时发出两个单独的http请求。
1. 请求1检查访问令牌并确定其无效。然后它发出一个refreshAccessToken请求。 2. 当请求1等待响应时,请求2也检查访问令牌并确定其无效。它也发出一个refreshAccessToken请求。 3. 请求1成功返回并更新访问令牌和刷新令牌的值。 4. 然后,请求2从api获得401响应,因为它提供的刷新令牌已被使用。我的应用程序会认为refreshToken存在错误,并注销用户。
这显然是不正确的,我想避免这种情况。与此同时,我在refreshAccessToken onFailed()方法中进行了双重检查,以查看accessToken是否可能再次有效。但是这是低效的,因为我仍然发送了两个请求,并且我的API必须处理刷新失败的尝试。
问题:现在我的问题是我不能使用任何锁或同步,因为您不能阻止Android主UI线程。而Android Async Http Library处理所有不同的线程等。