Прогрессивная загрузка изображений с помощью ReactiveX

Я пытаюсь загрузить уменьшенное изображение предварительного просмотра, за которым следует изображение нанимает. Я хочу убедиться, что если по какой-то причине изображение нанимает будет загружено первым, изображение предварительного просмотра будет удалено.

Рассмотрим следующие примеры, где:

  • Последовательность 1 — это запросы на предварительный просмотр изображений.
  • Последовательность 2 — нанимает запросы на изображения.
  • Последовательность 3 представляет собой комбинированную последовательность
  • Последовательность 4 — результирующая последовательность рендеринга изображения.

.

Example 1:

 1    ------P-------
 2    ---------H----

 3    ------P--H----

 4    ------*--*----


Example 2:

 1   ----H---------
 2   --------P-----

 3   ----H|--------

 4   ----*|--------

Единственное решение, которое я придумал до сих пор, — это сохранить переменную состояния, которая указывает, были ли уже загружены наймы, и использовать takeWhile, но это требует некоторых неэлегантных манипуляций, а также включает побочные эффекты.

Я ищу правильный способ RX сделать это.


person Shahar    schedule 18.04.2017    source источник


Ответы (1)


Вы можете сделать это без сохранения состояния и использования переменной:

Observable<Bitmap> hiresObservable = getHiresObservable()
        .share()
Observable<Bitmap> previewObservable = getPreviewObservable()
        .takeUntil(hiresObservable);


Observable.merge(previewObservable, hiresObservable)
      .subscribe(bitmap -> {
           //do something with the bitmap
      });

это очень похоже на этот ответ.

person yosriz    schedule 18.04.2017
comment
потому что в противном случае вы дважды подпишетесь на наймнаблюдатель, который вам не нужен, поделитесь «многоадресной рассылкой» вашего Observable, чтобы несколько подписок видели одни и те же значения, на самом деле вам может потребоваться быть более осторожным и использовать другой оператор «многоадресной рассылки», чтобы предотвратить гонку (например, если у вас есть кеш), вы можете прочитать мое объяснение здесь: stackoverflow.com/a/42826568/3903847 - person yosriz; 18.04.2017