首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于API请求的Android队列

用于API请求的Android队列
EN

Stack Overflow用户
提问于 2015-04-07 21:40:21
回答 1查看 2K关注 0票数 2

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

因此,我的问题是:如何创建一个api请求队列,并能够为每个请求设置优先级。

提前行动!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-09 02:03:03

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

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

所以我想..。限制请求意味着每个请求都需要在特定的时间发生。如果您没有排队请求,而是排队等待时间呢?如果您有一个单独的人为请求分配时隙怎么办?它会产生这样的效果:

  • 首先调用时隙分发器上的方法来接收时隙。从现在起,当请求可以执行时,时隙将以毫秒的延迟时间给出。
  • 如果延迟大于零,则为延迟调用Handler.postDelayed(),并使用包含请求逻辑的可运行的
  • 延迟后,Handler将处理Runnable,它启动AsyncTask或后台线程来处理请求。

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

代码语言:javascript
复制
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(),这样您就不会受到用户更改时钟时间的影响(不要忘记将您的间隔乘以1000000)。但要点是:

  1. 最近的请求任务的执行时间只有一个(即静态)位置。
  2. 当你分配一个时隙时,你会检查这个时间并增加它。
  3. 您需要同步对分发器方法的访问。(好吧,你可能得跟死锁搏斗了。)

这很简单。我喜欢简单。我是说我真的很喜欢简单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29501834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档