Java 从(需要在另一个线程上完成的事情)

Java 从(需要在另一个线程上完成的事情),java,rx-java,Java,Rx Java,我正在学习Rx java,遇到了一个小问题。 我正在尝试获取一个对象列表,并将其传递给Observable.from(),以便处理它 问题:此列表需要在另一个线程(内部http调用)上获取,因此Observable.from(getList())没有提供任何信息 我试过这样的方法: 创建(新的Observable.OnSubscribe>(){ @凌驾 公用无效呼叫(用户>用户){ subscriber.onNext(getList()); subscriber.onCompleted(); }

我正在学习Rx java,遇到了一个小问题。 我正在尝试获取一个对象列表,并将其传递给Observable.from(),以便处理它

问题:此列表需要在另一个线程(内部http调用)上获取,因此Observable.from(getList())没有提供任何信息

我试过这样的方法:

创建(新的Observable.OnSubscribe>(){ @凌驾 公用无效呼叫(用户>用户){ subscriber.onNext(getList()); subscriber.onCompleted(); } }).订阅

但是在一个Iterable上订阅时,onNext只传递完整的列表,而不是列表中的每个OIbject。 我错过了什么?我该怎么做? 谢谢

更新

以下是我试图做的(以及我如何使用排序列表):

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