Eric
ну да, есть шедулеры. Которые выполняют сервис с заданым интервалом. Но они не живут перманентно.
Student
Всем привет. Вопрос адресую людям, разбирающимся в 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 }
--------
Всем привет. Вопрос адресую людям, разбирающимся в 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 }
тебе же вчера отвечали, напиши свой interceptor
Student
тебе же вчера отвечали, напиши свой interceptor
да не в интерцепторе дело. писал я свой интерцептор. нужна помощь в написании реактивной цепочки
Student
onErrorResumeNext
onErrorResumeNext в fun1, а flatMap в fun2?
Arsen
флетмап не нужен, onErrorResumeNext отдает обсервабл
Arsen
instructs an Observable to begin emitting a second Observable sequence if it encounters an error
.
Денис, я ж тебе скинул цепочку прям готовую уже
.
подправить чуток и пользуйся
Arsen
fun1() .onErrorResumeNext { fun2() } .sub...
Alex Android
Салют, кто работал с Fresco? Как оно высчитывает итоговый размер? Просто у меня размер оригинала и загруженного не совпадает
Сергей
Если приложение реально уничтожается - то переменные в нем пропадут и при следующем запуске он будет пнресоздан
Mike
Приложуха — обычный unix-процесс, в котором запущена виртуальная машина. Процесс убивается -> VM убивается -> загруженные классы больше не загружены. То есть любое состояние, которое по нелепой ошибке разработки там оказалось, теряется.
Вадим
В манифесте у активити скорее всего adjustResize стоит
В манифесте такого нету. В фрагменте просто лежит scrollview. Мб он как-то влияет
mike
onDestroy у фрагмента вызывается 100% или есть случаи когда не вызывается?
Dmitry
onDestroy у фрагмента вызывается 100% или есть случаи когда не вызывается?
Если хранить ссылку на него в статическом поле
Dmitry
што? Как это влияет?
Утечка будет, разве нет?
Mike
В манифесте такого нету. В фрагменте просто лежит scrollview. Мб он как-то влияет
есть любопытная штука View#setScrollContainer, но на моей памяти её использовал только ресайклер
mike
есть случаи, когда не вызывается
Можно поподробнее где-то про это почитать?
Сергей
Это если и влияет то на утечку а не на вызов метода
Mike
Утечка будет, разве нет?
будет, но на дестрой никак не повлияет
Mh
Если хранить ссылку на него в статическом поле
Например, когда ты закроешь приложение свайпом. Либо система сама убьет его из-за соображений памяти, когда ты свернул его
Mike
Можно поподробнее где-то про это почитать?
там должно быть то же самое, что и про активити
Вадим
Уже исправил. android:focusableInTouchMode="false" android:isScrollContainer="false" Добавил вот эти два поля в xml.
Вадим
есть любопытная штука View#setScrollContainer, но на моей памяти её использовал только ресайклер
Mh
Можно поподробнее где-то про это почитать?
Когда приложение уходит в бекграунд, у тебя вызывается onStop, но если оно будет закрыто килом процесса, onDestroy не будет вызван. И если ты хранил какие-то данные в памяти и не сохранил их в локальном хранилище, они будут потеряны. Если тебе надо сохранять данные, не делай это в onDestroy, т.к. он может быть не вызван.
George
Подскажите пожалуйста, я получаю объект JSONObject как мне его распарсить по значениям
Mh
Подскажите пожалуйста, я получаю объект JSONObject как мне его распарсить по значениям
val errorBody = JSONObject(json) val errorsArray = errorBody.getJSONArray("errors") val error = errorsArray.getJSONObject(0) return error.getString("title")
Mike
btw, а нет ли какой-нибудь апишки для трансформаций стримов токенов?
Mh
Можно поподробнее где-то про это почитать?
https://developer.android.com/guide/components/activities/activity-lifecycle#ondestroy
⬤ vitaly
что-то у меня совсем лыжи не едут... Стоит автокэнсел фолс и всё равно уведомление пропадает, почему так?
⬤ vitaly
Сергій
Возможно из-за small icon
Сергій
Это не должна быть иконка лаунчера
⬤ vitaly
Это не должна быть иконка лаунчера
при любой иконке закрывается по нажатию...
Сергій
а, ты про нажатие
Сергій
> Стоит автокэнсел фолс и всё равно уведомление пропадает не сразу уловил из вопроса что ты про нажатие
Leonid
всем привет, подскажите пожалуйста какой нибудь рабочий пример где в retrofit 2 отправляется запрос в @body как в примере https://stackoverflow.com/questions/21398598/how-to-post-raw-whole-json-in-the-body-of-a-retrofit-request
⬤ vitaly
а, ты про нажатие
да, забыл написать. Жму на уведомление, открывается активити какая надо, но уведомление пропадает, хотя вроде нигде не указано это поведение.
Leonid
Ты дал ссылку на рабочий пример)
я не совсем понимаю как его использовать в своем проекте. как правильно его вызывать не понимаю. у меня щас есть рабочий пример переделанный под мою задачу, но почему то он отправляет пустой запрос на сервер
⬤ vitaly
я не совсем понимаю как его использовать в своем проекте. как правильно его вызывать не понимаю. у меня щас есть рабочий пример переделанный под мою задачу, но почему то он отправляет пустой запрос на сервер
поля класса объекта, который ты передаёшь в его метод а аннотируешь как боди, запишутся в тело запроса как джейсон (или какой тип выставишь в хедерс)
Leonid
покажи пример
вот интерфейс
Mike
вот интерфейс
здесь нет body
Leonid
вот вызов
Mh
вот интерфейс
неправильный интерфейс
.
Leonid если ты юзаешь GET то это обычно Query, если POST то Body
Leonid
здесь нет body
я знаю что сдесь нет body, мне скидывали рабочий пример такой же, но у меня почему то пустой запрос
.
я говорю "обычно"
Leonid
как определяешь, что пустой, и что это значит?
на сервер приходит пустой запрос, через постман делаю запрос до сервера все нормально через приложение возвращает 400 ошибку
Leonid
Как делаешь через постман? Как видишь, что пустой?
сделали на сервере чтобы возвращался отправленный запрос, в постмане что отправляю то и приходит, а через приложение выдает ошибку то что null обьект
Mh
сделали на сервере чтобы возвращался отправленный запрос, в постмане что отправляю то и приходит, а через приложение выдает ошибку то что null обьект
public interface SafeUserApi { @FormUrlEncoded @POST("/api/userlogin") void getUserLogin( @Field("client_id") String id, @Field("client_secret") String secret, @Field("username") String uname, @Field("password") String password, Callback<LoginResult> cb ); }
Mh
Если JSON, то @Body
Mh
public interface SafeUserApi { @FormUrlEncoded @POST("/api/userlogin") Call<ResponseBody> getUserLogin( @Field("client_id") String id, @Field("client_secret") String secret, @Field("username") String uname, @Field("password") String password ); }
Mike
так убирай query и шли body с джейсоне
Leonid
Если JSON, то @Body
да я это понимаю, но не могу реализовать, все уже перечитал и пересмотрел все примеры
Mh
data class RequestBody(val login: String, val password: String) и через @Body отправляй
Mike
да я это понимаю, но не могу реализовать, все уже перечитал и пересмотрел все примеры
Почему не можешь-то? Отправь просто мапку, mapOf("login" to login, "password" to password)
Leonid
Mike
делал уже так
да не RequestBody, а Map<String, String>
Mh
Как ретрофит создаешь?