Reputation:
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
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
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