gpt4 book ai didi

API 请求的 Android 队列

转载 作者:行者123 更新时间:2023-11-29 20:49:34 25 4
gpt4 key购买 nike

我正在为 Android 上的 VK 社交网络编写客户端。这个社交网络每秒只允许执行 2-3 个请求,当我向不同的方法添加一些请求时,我会遇到异常,例如。 “每秒请求太多”

所以我的问题是:如何制作 API 请求队列,并能够为每个请求设置优先级。

提前致谢!

最佳答案

这是一个有趣的问题,因为在我的应用程序中,我倾向于为每种不同类型的服务器请求使用专用的 AsyncTask。因此,当我阅读这个问题时,我在问自己:当每个任务都是一个不知道其他任务的独立组件时,我将如何实现这样的事情?

我可以尝试像@GabeSechan 所说的那样创建一个PriorityQueue,但这意味着我需要一个后台线程专门用于等待任务出列,然后在执行队列任务的同时执行它们。但是这个线程听起来必须是一个 Service,所以我必须添加所有的基础设施。那么如何调试诸如挂起和竞争条件甚至死锁之类的多线程问题呢?不,谢谢。必须有更简单的方法...

所以我开始思考......限制请求意味着每个请求都需要在特定时间发生。如果不是对请求进行排队,而是对时间进行排队会怎样?如果您有一个为请求分配时隙的单例怎么办?它会像这样工作:

  • 首先调用时隙分配器上的方法来接收时隙。从现在开始可以执行请求时,将以毫秒为单位提供时隙。
  • 如果延迟大于零,为延迟调用Handler.postDelayed(),使用包含请求逻辑的Runnable
  • 延迟后,Handler 处理启动 AsyncTask 或后台线程以处理请求的 Runnable。

时隙分配器的逻辑如下所示:

public static synchronized long getNextRequestDelay() {

long delay = 0;
long current = System.getCurrentTimeMillis();
if (current > sLastRequestTime + REQUEST_GAP_MILLIS) {
// we don't have any outstanding requests
sLastRequestTime = current;
} else {
// figure out what the delay needs to be
sLastRequestTime += REQUEST_GAP_MILLIS;
delay = sLastRequestTime - current;
}

return delay;
}

现在,我在那里写了一些代码,但我只是将它输入到答案中,所以我什至不会声称它会编译。更不用说您应该使用像 System.nanoTime() 这样的单调时钟而不是 System.currentTimeMillis() 这样您就不会受到用户更改时钟的影响时间(不要忘记将 GAP 乘以 1000000)。但要点是:

  1. 最近请求任务的执行时间只有一个(即静态)位置
  2. 你检查那个时间并在每次分配一个时间段时增加它
  3. 您需要同步访问分配器方法。 (好吧,毕竟你可能不得不与死锁作斗争。)

很简单。而且我喜欢简单。我的意思是,我真的喜欢简单。

关于API 请求的 Android 队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29501834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com