Как реализовать очередь запросов?

У меня есть приложение, которое использует методы из стороннего SDK (асинхронные методы для отправки HTTP-запросов на удаленный сервер) и Retrofit2 + OkHttp + Rx для прямого доступа к этому серверу. Это выглядит так:

new SdkRequest("some", "arguments", "here")
    .setCompleteListener(this::onGetItemsComplete)
    .setErrorListener(this::onGetItemsError)
    .getItems(); // Here is can be differents methods (getShops, getUsers, etc)

ApiManager.getInstance()
    .getApi()
    .addAdmin("some", "another", "arguments", "here") // Methods which not presented in SDK we should call directly
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(this::onAddAdminComplete, this::onAddAdminError);

Мне нужно, чтобы все запросы (из SDK и из Retrofit) с ограничением - 5 запросов в 1 секунду макс. Когда этот предел превышен, запрос должен подождать, прежде чем продолжить.

Как это реализовать? Первое, что приходит в голову — добавить Service и BroadcastReceiver. Но для меня это не так уж и лениво: я должен слушать этот BroadcastReceiver в каждом фрагменте активности, а вот столь полезных обратных вызовов с этой реализацией нет. Можно ли реализовать его с помощью Rx (также обернуть методы SDK) и использовать лямбда-выражения?


person BArtWell    schedule 23.06.2017    source источник


Ответы (1)


Вы можете сделать это легко, без дополнительных потоков или сервисов, с помощью семафора.

Semaphore s = new Semaphore(40);
...
s.acquire();
try {
    dispatcher.dispatchRpcRequest(); // Or whatever your remote call looks like
} finally {
    s.release();
}
person geekfreak.xyz    schedule 23.06.2017
comment
Спасибо за ответ. Не могли бы вы немного объяснить? Что такое диспетчерский объект? Могу ли я использовать его в потоке пользовательского интерфейса? - person BArtWell; 23.06.2017
comment
Всякий раз, когда вы изменяете экран или любое событие, или вызываете метод в коде, все это происходит в потоке пользовательского интерфейса, и поток пользовательского интерфейса ставит в очередь вызываемый метод в очередь диспетчера.... ЕСЛИ вам это нравится, палец вверх, мой мужчина - person geekfreak.xyz; 23.06.2017
comment
Я не могу найти информацию о классе Dispatcher в справочнике по Android. Где я могу получить информацию об этом? - person BArtWell; 23.06.2017