2015-05-15 125 views
3

我正在使用我的应用中的Android异步Http库进行异步http请求。如何在Android中同步/限制某些异步http调用

我已经进入我的android应用程序的情况下,发生以下情况。我的web API使用访问令牌和刷新令牌。在我所做的每个请求上,我都会检查访问令牌是否仍然有效。如果不是我,那么发出一个http帖子去使用刷新令牌获取一个新的访问令牌。

现在我已经注意到以下情况。

我的应用程序的用户在访问令牌到期时将其手机保持非活动状态的时间足够长。当他们唤醒电话时。在我的onResume()函数中,我发出了两个单独的http请求。

  1. 请求1检查访问令牌并确定其无效。它然后发出refreshAccessToken请求。
  2. 虽然请求1正在等待响应,但请求2还检查访问令牌并确定其无效。并且它还发出refreshAccessToken请求。
  3. 请求1成功返回并更新访问令牌和刷新标记值。
  4. 请求2,然后从API获取401响应,因为它提供的刷新标记已被使用。然后,我的应用程序认为refreshToken存在错误,并将用户注销。

这显然是不正确的,我想避免它。我同时在refreshAccessTokenonFailed()方法中做了重复检查。查看accessToken是否可能再次有效。然而,这样做效率不高,因为我仍然无视sedning两个请求,而且我的API必须处理失败的刷新尝试。

问: 现在我的问题是,我不能使用任何锁或同步,你不能阻止在主UI线程的机器人。和Android异步HTTP库处理所有不同的线程等

+1

如果您并发发送请求1和2,则可能需要在此处进行一些更改,如果您获得401,则无法将用户注销。如果要保留该用户,则请求2当请求1被终止时。 如果你想同时发送两个数毫秒的速度,那么如果请求2产生一个401,但是只有请求1发生,那么不要将用户登出。 – Mostrapotski

回答

2

Request 2 also checks the access token and determines its not valid.

这是不对的。由于请求1可能已经发出refreshAccessToken请求,因此无法通过咨询服务器来确定访问令牌的状态。

所以你需要一个联合作战getAccessToken(),检查访问令牌,在需要的时候发出refreshAccessToken和并行调用时,只等着以前称为getAccessToken()操作。

UPDATE。 refreshAccessToken是用作网守的类的一部分,并且只有在访问令牌被刷新时才允许请求运行。如果令牌没有刷新,网守发送单个请求刷新令牌。同时,输入请求保存在队列中。当令牌刷新时,网守允许保存的请求运行。

+0

是的,除了我如何达到这个目标?我有一个获取刷新和访问令牌的函数,但是如何阻止并行请求而不阻塞主线程? – Zapnologica

+0

您告诉请求1和请求2并行运行。我假设他们使用自己的线程(如果没有,你已经阻止了主线程)。 –

+0

利用异步http库,所以主线程建立,然后启动这两个请求。但是它们在图书馆管理的不同线程上执行。我的主线程只是建立请求。所以我将不得不阻止请求2的执行直到请求1返回。即,我将不得不在主线程中阻止它,以便它不告诉库执行它。 – Zapnologica