RxJava Добавить новые объекты в поток

1

Я пытаюсь ввести новый объект в потенциально существующий поток.

Скажем, у меня есть это:

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);
}

Можно ли вводить предметы в один уникальный поток предметов каждый раз, когда нетерпеливый пользователь нажимает кнопку?

Теги:
rx-java
concurrency
rx-android

2 ответа

1
Лучший ответ

Если 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());
    }
}
1

Возможно, вопрос не имеет точности, хотя этот ответ довольно общий.

Основная идея заключалась бы в использовании [ 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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню