Я пытаюсь ввести новый объект в потенциально существующий поток.
Скажем, у меня есть это:
ItemUtils.java
public static void processItems(List<Item> items) {
Observable.from(items)
.subscribeOn(Schedulers.io())
.flatMap(ItemUtils::doSomeHeavyProcessing)
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
}
И в другом классе:
List<Item> items = new ArrayList<>();
public void onClick() {
processItems(list);
}
Можно ли вводить предметы в один уникальный поток предметов каждый раз, когда нетерпеливый пользователь нажимает кнопку?
Если List itmes - это очередность, в которой пользователь может добавить больше элементов, а processItems уже запущен, вы должны использовать Subjects
Queue<Item> items = new LinkedList<>();
PublishSubject<Item> subject = PublishSubject.create();
...
//subscribe once and supply new items in onClick
subject.subscribeOn(Schedulers.io())
.flatMap(ItemUtils::doSomeHeavyProcessing)
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
...
public void onClick() {
while(!queue.isEmpty()){
subject.onNext(queue.remove());
}
}
Возможно, вопрос не имеет точности, хотя этот ответ довольно общий.
Основная идея заключалась бы в использовании [ concatMap
] (http://reactivex.io/RxJava/javadoc/rx/Observable.html#concat(rx.Observable, rx.Observable)) или вариантов этого оператора.
Так, например, в зависимости от того, что действительно нужно для этого кода, можно:
public static void processItems(List<Item> items) {
Observable<ProcessdItem> processedItems = Observable.from(items)
.subscribeOn(Schedulers.io())
.flatMap(ItemUtils::doSomeHeavyProcessing)
.observeOn(AndroidSchedulers.mainThread());
Observable.concat(
Observable.just(ProcessedItems.preProcessed()),
processedItems
).subscribe();
}
Или в вложенных наблюдаемых.
public static void processItems(List<Item> items) {
Observable.from(items)
.subscribeOn(Schedulers.io())
.flatMap(i ->
Observable.just(ProcessedItems.preProcessed())
.concatWith(ItemUtils::doSomeHeavyProcessing))
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
}