user6747491
user6747491

Reputation:

RxJava2 .startWith(..) doesn't work

I have Observable what emit some String:

List<String> list = // size this list is 5
Observable o1 = Observable.fromArray(list.toArray());

and another one what emit one object per 10 second:

Observable intervalObservable = Observable.interval(10, TimeUnit.SECONDS);

I want to create Observable what every 10 second will emit every item from o1, so I did:

Observable change2tervalToString = intervalObservable.map(new Function() {
        @Override
        public Object apply(Object o) throws Exception {
            return "STARTER!";
        }
    });

Observable per10sec = o1.startWith(change2tervalToString);

If I .subscribe() to per10sec it doesn't emit something like:

"STARTER", "ITEM_FROM_LIST1", "ITEM_FROM_LIST2", "ITEM_FROM_LIST3"...

but only (every 10 second):

"STARTER"

I want to achive something like this:

"STARTER", "ITEM_FROM_LIST1", "ITEM_FROM_LIST2", "ITEM_FROM_LIST3"...
....
....
 10 sec
....
....
"STARTER", "ITEM_FROM_LIST1", "ITEM_FROM_LIST2", "ITEM_FROM_LIST3"...
....
....
....

Upvotes: 2

Views: 2285

Answers (3)

Cagla Cetin
Cagla Cetin

Reputation: 41

Try startWithItem() for rxjava3

Upvotes: 4

M. Prokhorov
M. Prokhorov

Reputation: 3993

Let's arrive at the conclusion from the other side.

You want to have:

"STARTER", "ListItem1", "ListItem2"...

This means:

Observable listItems = Observable.from(list.toArray());
Observable starter = Observable.just("STARTER");

Observable line = listItems.startWith(starter); // this will give you a line you want to emit

Then, you want to emit the line every 10 seconds. This means:

Observable timer = Observable.interval(10, TimeUnit.SECONDS);

// createLine() is the snippet from above.
Observable sequence = timer.flatMap(repetition -> createLine(list));

Also, assuming you don't want to wait 10 seconds before receiving first "line", you would want to start with a line:

sequence.startWith(createLine(list)); // first time emit immediately.

Documentation:

Upvotes: 0

Dhruv Jagetiya
Dhruv Jagetiya

Reputation: 1043

How about this:

Observable.interval(10, TimeUnit.SECONDS).flatMap(new Function<Long, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(Long aLong) throws Exception {
                return Observable.fromIterable(list);
            }
        });

Upvotes: 3

Related Questions