Java 从(需要在另一个线程上完成的事情)
我正在学习Rx java,遇到了一个小问题。 我正在尝试获取一个对象列表,并将其传递给Observable.from(),以便处理它 问题:此列表需要在另一个线程(内部http调用)上获取,因此Observable.from(getList())没有提供任何信息 我试过这样的方法: 创建(新的Observable.OnSubscribe>(){ @凌驾 公用无效呼叫(用户>用户){ subscriber.onNext(getList()); subscriber.onCompleted(); } }).订阅 但是在一个Iterable上订阅时,onNext只传递完整的列表,而不是列表中的每个OIbject。 我错过了什么?我该怎么做? 谢谢 更新 以下是我试图做的(以及我如何使用排序列表):Java 从(需要在另一个线程上完成的事情),java,rx-java,Java,Rx Java,我正在学习Rx java,遇到了一个小问题。 我正在尝试获取一个对象列表,并将其传递给Observable.from(),以便处理它 问题:此列表需要在另一个线程(内部http调用)上获取,因此Observable.from(getList())没有提供任何信息 我试过这样的方法: 创建(新的Observable.OnSubscribe>(){ @凌驾 公用无效呼叫(用户>用户){ subscriber.onNext(getList()); subscriber.onCompleted(); }
Observable.from(getList())
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.toSortedList(新函数2(){
@凌驾
公共整数调用(对象左、对象右){
如果(左。等于(右))
返回0;
返回left.getLabel(pm).compareToIgnoreCase(right.getLabel(pm));
}
})
.订阅(新观察员){
//“下一步”发送我正在使用的对象列表
}
问题是需要在另一个线程上调用getList()(并且它返回一个Iterable,而不是Observable)。
也许我没有正确使用你的第一个解决方案
更新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( ... )
可观察。仅(0)
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(新函数1(){
@凌驾
公共可观察呼叫(整数){
从(getList())返回可观察的.from;
}
})
.toSortedList(新函数2(){
@凌驾
公共整数调用(对象左、对象右){
如果(左。等于(右))
返回0;
返回left.getLabel(pm).compareToIgnoreCase(right.getLabel(pm));
}
})
.订阅(…)
或者用subscribe替换flatMap调用并在onNext中执行所有操作后,它仍会在主线程上调用getList()。当您要使用特定线程时,可以使用
subscribebeon
方法指定要使用的“tread”(调度程序)
如果它不起作用,您仍然可以使用您的解决方案。但只需在列表上迭代即可:
Observable.create(new Observable.OnSubscribe<CategorizedActivityInfoWrapper>() {
@Override
public void call(Subscriber<? super CategorizedActivityInfoWrapper> subscriber) {
for(o : getList()) {
subscriber.onNext(o);
}
subscriber.onCompleted();
}
}).subscribe ...
也可以这样写:
List objs = getList();
Observable.from(objs).subscribe();
因此,将在当前线程中调用
getList()
。您将无法控制调用哪个线程getList()
,您需要将异步计算放在observeOn
之前(也可以选择在subscribeOn
之后):
实际上,这两种解决方案都没有满足我的需求。在from()之后,我调用toSortedList(),这对我自己创建的订阅者不起作用(就像您建议的第二种解决方案)。实际上,我知道的唯一方法是调用Observable。只是(0),调用我的HTTPcall onNext并发送一个可观察的onComplete。Wich很难看。也许它可以通过将未来传递到from()来工作,但我现在不知道如何操作。1)如何使用toSortedList()?即使使用自定义的可观察对象(但对象可能是可比较的)。ie:sourceObservable.flatMap(Observable::from).toSortedList().subscribe();什么不起作用?2) 可观察。仅(0)将调用onNext和onCompleted。您试图实现的目标与您的客户可以观察到的目标相同。3) Observable.from(aFuture)将调用Future.get方法,然后阻塞。
Observable.create(new Observable.OnSubscribe<CategorizedActivityInfoWrapper>() {
@Override
public void call(Subscriber<? super CategorizedActivityInfoWrapper> subscriber) {
for(o : getList()) {
subscriber.onNext(o);
}
subscriber.onCompleted();
}
}).subscribe ...
Observable.from(getList()).subscribe();
List objs = getList();
Observable.from(objs).subscribe();
public class AsyncStartOtherThread {
public static void main(String[] args) throws Exception {
CountDownLatch cdl = new CountDownLatch(1);
Observable.just(1).subscribeOn(Schedulers.newThread())
.map(e -> {
System.out.println(Thread.currentThread());
return Arrays.asList(1, 2, 3, 4, 5);
})
.observeOn(Schedulers.computation())
.doOnNext(e -> System.out.println(Thread.currentThread()))
.flatMap(Observable::from)
.toSortedList((a, b) -> Integer.compare(b, a))
.subscribe(System.out::println, Throwable::printStackTrace, () -> { System.out.println("Done"); cdl.countDown(); });
;
cdl.await();
}
}