Как связать наблюдаемые с разными интервалами в RxJava? - PullRequest
0 голосов
/ 06 мая 2018

Я видел множество сообщений о том, что Rx задерживает каждую передачу события: Как сделать таймер обратного отсчета с помощью RxJS Observables? , Как использовать RxJava Interval Operator Operator, Добавление задержки между наблюдаемыми объектами RxJava , RxJava задержка для каждого отправляемого элемента списка и других.

Впрочем, я не видел ни одного для цепочки с разными задержками.

По сути, у меня есть Textview и список писем, и я бы хотел:

  • установить текст на первую букву
  • подождите 1500 мс
  • установить текст на ноль
  • подождите 500 мс
  • установить текст для второй буквы
  • подождите 1500 мс
  • установить текст на ноль
  • подождите 500 мс
  • повторить для всего списка

Реализация кода может выглядеть примерно так (но я думаю, doThing() - это нонсенс в Rx, а delay() не предназначен для этого):

Observable.fromArray(new String[]{"A", "B", "C", "D", "E"})
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .delay(500L, TimeUnit.MILLISECONDS)
        .doThing((String i) -> {
            textView.setText("");
            Log.d("XXX", "MainActivity :: onCreate (110): letter="+ i);
        })
        .delay(1500L, TimeUnit.MILLISECONDS)
        .doThing((String i) -> {
            textView.setText(i);
            Log.d("XXX", "MainActivity :: onCreate (110): letter="+ i);
        });

Как мне добиться этого с помощью Rx?

РЕДАКТИРОВАТЬ: Я мог бы использовать ответ от rxjava delay: Как получить переменную задержку для каждого элемента, генерируемого из списка? со списком букв, где одна буква на двоих является особенной (может быть, ноль?) , но это кажется слишком сложным.

1 Ответ

0 голосов
/ 06 мая 2018

Последовательность : A (1500ms) null (500ms) B (1500ms) null (500ms) C (500ms) null (1500ms)

textAnimationDisposable = Observable.fromArray("A", "B", "C")
        .concatMap(string ->
              Observable.merge(
                 Observable.just(string),
                 Observable.just("").delay(1500, TimeUnit.MILLISECONDS)
              )
              .concatWith(Observable.<String>empty().delay(500, TimeUnit.MILLISECONDS))
        )
        .observeOn(AndroidSchedulers.mainThread())
        .subscribeOn(Schedulers.newThread())
        .subscribe(string -> textView.setText(string));

Последнее решение , которое вы связали , весьма полезно для отдельного управления задержкой каждого элемента.

...