abhimskywalker abhimskywalker - 1 year ago 126
Java Question

rxjava delay: How to get variable delay on each item emitted from a list?

I want to have custom delays between each item emitted from an observable list as a function of the items themselves.
Let's say we have a list as (item, delay):

[("item1", 2),("item2", 1),("item3", 2),("item4", 3),("item5", 2),("item6", 3)]

I want output to be something like:

0 seconds:
1 seconds:
2 seconds:
3 seconds:
4 seconds:
5 seconds:
6 seconds:
7 seconds:
8 seconds:
9 seconds:
10 seconds:
11 seconds:
12 seconds:
13 seconds:

I am not sure how to best accomplish this with delay/timer operators. Went through delay documentation but couldn't figure out a straightforward way. Any pointers would be helpful. Thanks!

Answer Source

No need for anything fancy. Just use concatMap and delay operators

jla.concatMap(s -> Observable.just(s).delay(s.delay, TimeUnit.SECONDS))           
  .subscribe(s1 -> System.out.println(s1.name + " just came..."), 
             e -> {}, 
             () -> System.out.println("Everybody came!"));