【发布时间】:2015-05-02 16:47:54
【问题描述】:
我正在学习 Rx-java,遇到了一个小问题。 我正在尝试获取 Object 列表并将其传递给 Observable.from() 以便我可以处理它。
问题:这个列表需要在另一个线程上获取(内部有 http 调用),所以 Observable.from(getList()) 什么也没给我。
我尝试过类似的方法:
Observable.create(new Observable.OnSubscribe>() { @覆盖 公共无效调用(订阅者>订阅者){ 订阅者.onNext(getList()); 订阅者.onCompleted(); } }).订阅...
但是这个订阅是在一个 Iterable 上的,onNext 只传递完整的列表,而不是列表中的每个 OIbject。 我错过了什么?我怎么做 ? 谢谢
更新
这是我正在尝试做的事情(以及我如何使用 toSortedList):
Observable.from(getList())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.toSortedList(new Func2<Object, Object, Integer>() {
@Override
public Integer call(Object left, Object right) {
if (left.equals(right))
return 0;
return left.getLabel(pm).compareToIgnoreCase(right.getLabel(pm));
}
})
.subscribe(new Observer<List<Object>>() {
//On next sends a List of objects I'm using
}
问题是 getList() 需要在另一个线程上调用(它返回一个 Iterable,而不是 Observable)。 也许我没有正确使用您的第一个解决方案 dwursteisen。
更新 2
这是我不明白为什么它不起作用的东西:
Observable.just(0)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<Integer, Observable<Object>>() {
@Override
public Observable<Object> call(Integer integer) {
return Observable.from(getList());
}
})
.toSortedList(new Func2<Object, Object, Integer>() {
@Override
public Integer call(Object left, Object right) {
if (left.equals(right))
return 0;
return left.getLabel(pm).compareToIgnoreCase(right.getLabel(pm));
}
})
.subscribe( ... )
或者通过订阅替换 flatMap 调用并在 onNext 中执行所有操作,它仍然在 mainThread 上调用 getList() ...
【问题讨论】: