为什么onNext无效

时间:2018-11-02 19:17:40

标签: java java-8 observable rx-java2

如下所示,我正在学习如何使用rxjava。我想知道如何使用地图运算符显示每个列表中有多少个人对象。 问题是,当我从可观察到的位置运行onNext代码时,永远不会被调用。

注意:下面发布的人员类包含可选属性。

请让我如何使用地图运算符显示每个列表中有多少个人对象。

预先感谢

代码

public class Main {

public static void main(String[] args) {
    Observable<List<Person>> observables = Observable.create(e-> {
        for(List<Person> p : Main.getPersons()) {
            e.onNext(p);
        }
        e.onComplete();
    });
     observables
    .map(p->p.size())
    .observeOn(Schedulers.io())
    .subscribe(new Observer() {
        @Override
        public void onComplete() {
            // TODO Auto-generated method stub
            System.out.println("onCompleted");
        }

        @Override
        public void onError(Throwable arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onNext(Object arg0) {
            // TODO Auto-generated method stub
            System.out.println("onNextFromObserver: " + arg0);
        }

        @Override
        public void onSubscribe(Disposable arg0) {
            // TODO Auto-generated method stub
        }
    });
}

private static <T> Observable<T> toObservable(T s) {
    return Observable.just(s);
}
private static List<List<Person>> getPersons() {
    return Arrays.asList(
            Arrays.asList(new Person("Sanna1", 59, "EGY"), new Person(null, 59, "EGY"), new Person("Sanna3", 59, null)),
            Arrays.asList(new Person("Mohamed1", 59, "EGY"), new Person(null, 59, "EGY")),
            Arrays.asList(new Person("Ahmed1", 44, "QTR"), new Person("Ahmed2", 44, "QTR"), new Person(null, null, "QTR")),
                    Arrays.asList(new Person("Fatma", 29, "KSA")),
                    Arrays.asList(new Person("Lobna", 24, "EGY")));
}
}

人员

public class Person {
private String name = null;
private String address = null;
private int age;

private Optional<String> optName= null;
private Optional<Integer> optAge= null;
private Optional<String> optAddress = null;

public Person(String name, Integer age, String address) {
    this.optName = Optional.ofNullable(name);
    this.optAge = Optional.ofNullable(age);
    this.optAddress = Optional.ofNullable(address);
}

public Optional<String> getName() {
    return optName;
}

public void setName(String name) {
    this.optName = Optional.ofNullable(name);
}

public Optional<String> getAddress() {
    return this.optAddress;
}

public void setAddress(String address) {
    this.optAddress = Optional.ofNullable(address);
}

public Optional<Integer> getAge() {
    return this.optAge;
}

public void setAge(int age) {
    this.optAge = Optional.ofNullable(age);
}
}

1 个答案:

答案 0 :(得分:2)

Schedulers.io()未执行的原因与main使用守护程序线程这一事实有关。这意味着,如果没有其他线程处于活动状态,它们将无法保持JVM的运行。

简而言之,因为您的onNext函数结束了,并且唯一正在运行的代码是IO调度程序,它将在以后调用blockingSubscribe。由于没有非守护程序线程处于活动状态,因此JVM实际退出之前就退出了。使用Base阻塞主线程,直到可观察的对象结束,您将看到期望的输出。