Я нашел проблему, которая была очень хитрой.Проблема вызвана операцией 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));
Вы также можете оформить этот средний пост об этом