RxJava将新对象添加到流中

时间:2015-04-11 14:57:38

标签: java concurrency rx-java rx-android

我试图将新对象注入潜在的现有流中。

我们说我有这个:

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

每次不耐烦的用户按下按钮时,是否可以将项目注入一个唯一的项目流?

2 个答案:

答案 0 :(得分: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();
}

或嵌套的observable。

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

答案 1 :(得分:1)

如果列表项是一种队列,用户可以在处理项已启动时添加更多项,则应使用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());
    }
}