Size: a a a

ReactiveX - русскоговорящее сообщество

2020 April 24

АК

Артем Кулик in ReactiveX - русскоговорящее сообщество
Nikita Domnickij
И действительно, спасибо
источник
2020 April 27

TA

The AP in ReactiveX - русскоговорящее сообщество
источник

U

Untec in ReactiveX - русскоговорящее сообщество
SPAM
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
привет
обнаружил странное поведение delay()

fun onConfirmClick() {
   dataStatus.postValue(Loading)
   disposables.add(
           repository
                   .sendConfirm()
                   .delay(10, TimeUnit.SECONDS)
                   .subscribeOn(Schedulers.io())
                   .observeOn(AndroidSchedulers.mainThread())
                   .subscribe({ result ->
                       dataStatus.postValue(FullDataResult)
                       externalListener.updateData()
                   }, {
                       dataStatus.postValue(ErrorResult(it.localizedMessage))
                   })
   )
}


этот метод во вьюмодели, запускается от нажатия кнопки.
при таком раскладе 10 секунд крутится прогресс бар, при этом я закрываю окно, вьюмодель вызывает onClear(), в котором зачищается  disposables. Вызывается точно, логи говорят об этом.
но при этом, через 10 сек. вызывается externalListener.updateData(), который уже мертв(вернее там мертв презентер, неважно, просто возникает NPE).
Получается, delay() он делает запрос, получает ответ, и через 10 секунд исполняет то, что нужно при успешном ответе. при этом вызывается листенер уже не актуальный.
Я правильно понима это? и как мне сделать так, чтобы прогресс бар крутился 10 секунд и только тогда как бы приходил ответ?
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Что метод вызывается - ок, ты уверен. А ты уверен, что подписки зачищаются?)
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
да
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
clear() dispose() size() проверял
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
disposables - это CompositeDisposable()
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
у меня есть ощущение, что успешный результат кладется куда то в исполнение и ждет таймаута и ему пофик, что контейнер очищен
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Ну в таком случае верояно я чего то не знаю о delay, либо у тебя не происходит отписка. Если хочешь сделать костыльное решение - можно избежать npe при помощи optional mark. Но лучший способ выяснить, что у тебя происходит - смоделировать ситуацию в максимально простом виде, я обычно делаю это в тестах. Написать функцию, которую можно будет запускать отдельно от твоего аппа, в которой происходит, то же, что по твоим ожиданиям должно происходить у тебя в коде. И проверить на ней, работает или нет.
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
вобщем, в логах такое
viewModel clean: 0, т.е. onClean вызывается, подписок 0. это сразу. а через оставшиеся 7-8 секунд приложение падает
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Даже если результат будет тот же, будет значительно легче понять - почему это происходит и принять правильное решение
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Andrey Pomazkin
вобщем, в логах такое
viewModel clean: 0, т.е. onClean вызывается, подписок 0. это сразу. а через оставшиеся 7-8 секунд приложение падает
Логи для нищих. Ставь брейкпоинт в onClean и запускай через дебаггер )
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
ну разве что, это выполняется onClean другой вьюмодели(
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Andrey Pomazkin
ну разве что, это выполняется onClean другой вьюмодели(
Вот именно. Дебаггером увидишь стектрейс
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Но лучше смоделируй ситуацию
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
ну да, похоже это другая вьюмодель
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
ииии… тут я вспоминаю что храню вьюмодели в ViewModelStorage
источник

i

iamthevoid in ReactiveX - русскоговорящее сообщество
Можно сделать Log.d("${this.class.name}")
источник

AP

Andrey Pomazkin in ReactiveX - русскоговорящее сообщество
да, так и сделал. дебагом долго
источник