Size: a a a

StartAndroid Ru RxJava

2019 October 19

AK

Aleksandr Koscheev in StartAndroid Ru RxJava
Денис
Всем привет.
Вопрос адресую людям, разбирающимся в rx.
Задача: нужно сделать запрос в сеть.
В случае ошибки запроса, нужно сделать другой запрос. И только в случае успеха выполнения второго запроса,
передернуть первый запрос.
Сделал примерно вот так, но это не работает: вешает приложение, хотя okhttp в логах показывает,
что запрос из fun2 отрабатывает и прилетает 200 от сервера.
Грешу на blockingGet. Но если не блокировать запрос, а пользоваться subscribe({},{}), то происходит гонка,
и логика ломается.
Прошу дать советы, подсказать, ибо мои познания в rx пока достаточно поверхностны.

private fun fun1() {
 var disposable: Disposable? = null
 disposable = interactor.updateDictionary()  
   .doFinally { disposable?.dispose() }
   .subscribe(
     {},
     { error ->        
       if interactor.fun2()
         fun1()        
     }
   )
}

fun fun2(): Boolean {
 var success = false
 try {
   val updateValue = updateFun()
     .blockingGet()    
   success = true    
 } catch (exception: Throwable) {
   Timber.e(exception)
   success = false
 }
 return success
}
Типичная задача рефреша токена.

Очень.условнo так.
getStuff()
.on error return refresh token flat map getStaff
источник

AP

Anton Potekhin in StartAndroid Ru RxJava
Денис
Всем привет.
Адресую разработчикам с опытом в rxjava
Описание ситуации:
Авторизация на сервере у нас с двумя токенами.
В случае 401 я должен запустить логику по обновлению ACCESS_TOKEN с помощью REFRESH_TOKEN (openid authentication вроде бы это правильно называется).
В сеть лазаю с помощью ретрофита в связке с rxjava2.
Примерно так:
@GET("api/v1/drivers/current")
fun getCurrentDriver(): Single<DriverData>

Методы для вылазки в сеть возвращают либо Single, либо Completable.
Идея такова, что я хочу написать одну цепочку по обновлению токенов, и в случае 401 приклеить
её к каждому методу-запросу в сеть
Подскажите, пожалуйста, как правильнее это сделать и вообще правильная ли задумка.

Сейчас в случае 401 ошибки я в интерцепторе пораждаю кастомное исключение, которое обрабатываю в onError каждого похода в сеть.
Вызываю метод по обновлению токенов, который должен возвращать Boolean. И  в случае успешного обновления внутри OnError запускаю рекурсивно этот же метод.
Мало того, что это выглядит не очень, так еще и для того, что бы реактивный метод по обновлению токенов возвращал Boolean приходится блокировать поток с помощью оператора blockingGet

Буду рад советам. Спасибо заранее.
Если я правильно понял задачу то okhttp сам всё это делать умеет , а посколько retrofit использует okhttp то пляски с rx вам не нужны
источник
2019 October 21

Д

Денис in StartAndroid Ru RxJava
Anton Potekhin
Если я правильно понял задачу то okhttp сам всё это делать умеет , а посколько retrofit использует okhttp то пляски с rx вам не нужны
чтобы он умел, его нужно научить сперва)
источник

Д

Денис in StartAndroid Ru RxJava
источник

Д

Денис in StartAndroid Ru RxJava
поэтому если можете помочь, буду очень рад) спасибо
источник

АК

Агамирзаев Кабир in StartAndroid Ru RxJava
У кого какие варианты такое сделать
источник

SD

Sergey D in StartAndroid Ru RxJava
кастом вью что сложного ?   но это без рх др чат надо и не по дагеру )
источник

YG

Yura Gromyk in StartAndroid Ru RxJava
Агамирзаев Кабир
У кого какие варианты такое сделать
у меня было что-то очень похожее
Но его нужно допилить, а это будет не раньше выходных(
источник
2019 October 22

VZ

Vlad Zorin in StartAndroid Ru RxJava
Никто не знает, как сделать так что бы в контактах, когда смотришь номер какой то, в графе Действия было типа позвонить и там значок твоего приложения. Как это сделано типа Viber и WhatsApp
источник

JF

Jorik Fat in StartAndroid Ru RxJava
Добрый вечер. Помогите, пожалуйста, с решением проблемы:
Есть interactor через который идёт связь с api. Мне нужно вывести варианта автозаполнения, как это сделано в google по мере набора текста.
RxJava находится в presenter и сейчас делается запрос через Single.fromCallable(), я понимаю что решение неправильное. Нужно через Observable сделать. Но не понимаю как сделать запрос в Observable (как ему передать новое знание вручную, чтобы он вызвал onNext() у Consumer)
источник
2019 October 23

AP

Anton Potekhin in StartAndroid Ru RxJava
Jorik Fat
Добрый вечер. Помогите, пожалуйста, с решением проблемы:
Есть interactor через который идёт связь с api. Мне нужно вывести варианта автозаполнения, как это сделано в google по мере набора текста.
RxJava находится в presenter и сейчас делается запрос через Single.fromCallable(), я понимаю что решение неправильное. Нужно через Observable сделать. Но не понимаю как сделать запрос в Observable (как ему передать новое знание вручную, чтобы он вызвал onNext() у Consumer)
источник

🤡M

🤡 Maxvoitenko🐒 in StartAndroid Ru RxJava
Гайс, всем привет, мне нужн сделать метод в бекграунде который возвращает мне что-либо  (НЕ ентити rxJav’ы), и вернуть это в мейн тред, что мне лучше всего использовать?
Думал Completable.fromAction() Но в этом случае подписчик не получет ничего обратно
источник

AM

Andrey Martynenko in StartAndroid Ru RxJava
🤡 Maxvoitenko🐒
Гайс, всем привет, мне нужн сделать метод в бекграунде который возвращает мне что-либо  (НЕ ентити rxJav’ы), и вернуть это в мейн тред, что мне лучше всего использовать?
Думал Completable.fromAction() Но в этом случае подписчик не получет ничего обратно
может тогда Single попробуй?)
источник

AM

Andrey Martynenko in StartAndroid Ru RxJava
Completable же для того, типа, ок не ок и всё)
источник

🤡M

🤡 Maxvoitenko🐒 in StartAndroid Ru RxJava
как мне мой метод обернуть в сингл? просто это сдк стороняя и я не решаю что она мне возвращает
источник

AM

Andrey Martynenko in StartAndroid Ru RxJava
Single.create() вроде
источник

JF

Jorik Fat in StartAndroid Ru RxJava
Single.fromCallable(sdk.method())
источник

JF

Jorik Fat in StartAndroid Ru RxJava
И потом дописываешь:
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(handleResult());
источник

JF

Jorik Fat in StartAndroid Ru RxJava
Ребят, а как сделать обертку асинхронную над методом, который вызывается много раз подряд и обращается к серверу, получить нужно только ответ последнего обращения (остальные игнорировать/блокировать)
источник

AP

Anton Potekhin in StartAndroid Ru RxJava
Jorik Fat
Ребят, а как сделать обертку асинхронную над методом, который вызывается много раз подряд и обращается к серверу, получить нужно только ответ последнего обращения (остальные игнорировать/блокировать)
читайте про сабджекты если я конечно правильно понял вашу задачу
источник