Tsudzukeru
@Tsudzukeru

Как вызвать retry() для асинхронного метода, изменив параметры вызова этого метода?

Есть асинхронный метод AsyncMethod(param1:String, param2:String, apiKey:String), в качестве одного из параметров которого - Api ключ. Данный ключ лежит в Singleton классе ApiKeyStore, в качестве поля. Данный метод обращается к серверу и возращает Json твет. На каждый Api ключ есть лимит, и при достижении его AsyncMethod() выдает ошибку 403.
В таком случае в doOnError() - я обращаюсь к ApiKeyStore и меняю Api ключ на новый. Дальше по цепочке вызова срабатывает метод retry(), для того, чтобы повторить вызов AsyncMethod, но данный метод вызывается с прежним Api ключем, хотя в ApiKeyStore ключ изменился.

//примерный код
AsyncMethod(param1,param2,ApiKeyStore.CurrentKey)
.doOnError{
ApiKeyStore.getNextApiKey()
}
.retry(ApiKeyStore.attemptsNumber)


Такое ощущение, что проблема связана с областью памяти, где хранятся параметры метода. Как можно решить данную проблему?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
Всё происходит правильно. AsyncMethod(param1,param2,ApiKeyStore.CurrentKey) вызывается только один раз, и при каждом retry происходит переподписка к его результату. Поэтому ключ не меняется. Нужно сделать так, чтобы при retry вызывался сам метод, а значит - использовать Observable.defer:
Observable.defer { AsyncMethod(param1,param2,ApiKeyStore.CurrentKey) } 
.doOnError{
    ApiKeyStore.getNextApiKey()
}
.retry(ApiKeyStore.attemptsNumber)

Теперь при retry переподписка будет к defer, и каждый раз будет вызываться AsyncMethod с новыми параметрами.
Как-то так.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы