developers!我正在尝试在实际项目中使用 RxJava,但似乎我没有正确理解它的逻辑。我需要在新线程中创建对象列表。完成后,将此列表发送给观察者。我发现的是:
LinkedList<IntroSliderElement> list = new LinkedList<>();
list.add(new IntroSliderElement(0, "test 0", 0));
list.add(new IntroSliderElement(1, "test 1", 1));
list.add(new IntroSliderElement(2, "test 2", 2));
Observable<LinkedList<IntroSliderElement>> listObserv = Observable.just(list);
listObserv
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<List<IntroSliderElement>>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(List<IntroSliderElement> value) {
view().render(new IntroModel.OnFirstSliderElement((LinkedList<IntroSliderElement>) value));
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
但是很容易看出,列表在主线程中创建和实现,那么如何使用 rxJava 在全新的线程中创建它呢?
你想要的大概是Observable.fromCallable((。
Observable.fromCallable(() -> {
// init your list here
yourList = ....
Observable.fromIterable(yourList);
});
内部代码将在订阅发生时执行。因此,您可以在您喜欢的线程上执行订阅。
无论订阅是否发生,Observable.create()
都会立即执行,这就是为什么建议谨慎使用它的原因。
正如Artem Zinnatullin的帖子所述:
如果可以的话,不要使用 Observable.create((,这很容易搬起石头砸自己的脚!(然后为每个新订阅者再次拍摄!
这里的问题是just
运算符创建一个可观察量,它只是发出最后一项。它对创作本身没有影响。您需要在 OnSubscription 回调中创建此列表,并在准备就绪后发出。然后,您可以使用运算符指定将在哪个调度程序上运行此函数subscribeOn
。
Observable.create(emitter -> {
LinkedList<IntroSliderElement> list = new LinkedList<>();
list.add(new IntroSliderElement(0, "test 0", 0));
list.add(new IntroSliderElement(1, "test 1", 1));
list.add(new IntroSliderElement(2, "test 2", 2));
emitter.onNext(list);
emitter.onComplete();
})
.subscribeOn(Schedulers.newThread())
.observeOn(/* You should choose the thread on which the result will be processed */)
.subscribe(result -> {
// process the result here
})