LiveData setValue не работает после doOnComplete Android RXJava - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть наблюдаемая Completable, и я использую оператор doOnComplete () для обновления моих событий.Но когда я обновляю liveata, используя setValue, у меня не работает замена на postValue.

Может кто-нибудь помочь мне, почему setValue не работает, даже после попытки установить планировщик в mainнить.

Completable.complete()
                .subscribeOn(Schedulers.io())).observeOn(AndriodSchdulers.mainThread())
                .delay(getApplication().getResources().getInteger(R.integer.one_minute_time_in_millisec), TimeUnit.MILLISECONDS)
                .doOnComplete(() -> liveData.setValue(some value))
                .subscribe();

1 Ответ

0 голосов
/ 30 ноября 2018

Я нашел проблему, которая была очень хитрой.Проблема вызвана операцией delay:

/**
* Delays the emission of the success signal from the current Single by     the specified amount.
* An error signal will not be delayed.
*
* Scheduler:
* {@code delay} operates by default on the {@code computation} {@link Scheduler}.
* 
* @param time the amount of time the success signal should be delayed for
* @param unit the time unit
* @return the new Single instance
* @since 2.0
*/
@CheckReturnValue
@SchedulerSupport(SchedulerSupport.COMPUTATION)
public final Single delay(long time, TimeUnit unit) {
    return delay(time, unit, Schedulers.computation(), false);
}

Как сказано в документации, задержка по умолчанию переключается на вычислительный поток.Итак, с observeOn(AndroidSchedulers.mainThread()), помещенным в начале, вы устанавливаете поток как поток пользовательского интерфейса, но затем в цепочке операция задержки превращает его обратно в поток вычислений.Таким образом, решение очень простое: поставьте observeOn после delay.

Completable.complete()
    .subscribeOn(Schedulers.io())
    .delay(1000, TimeUnit.MILLISECONDS)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(() -> mutableLiveData.setValue(true));

Вы также можете оформить этот средний пост об этом

...