【问题标题】:Why onNext has no effect [duplicate]为什么onNext没有效果[重复]
【发布时间】:2018-11-02 19:17:39
【问题描述】:

如下图,我正在学习如何使用rxjava。我想知道如何使用 map 运算符来显示每个列表中有多少 Person 对象。 问题是,当我从 observable 运行代码时 onNext 永远不会被调用。

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

请告诉我如何使用 map 运算符显示每个列表中有多少 Person 对象。

提前致谢

代码

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

【问题讨论】:

    标签: java java-8 observable rx-java2


    【解决方案1】:

    onNext 没有被执行的原因与Schedulers.io() 使用守护线程有关。这意味着如果没有其他线程处于活动状态,它们不会保持 JVM 运行。

    简单地说,因为您的main 函数结束并且唯一运行的代码是IO 调度程序,它将在未来调用onNext。由于没有非守护线程处于活动状态,因此实际上可能会在此之前退出 JVM。使用 blockingSubscribe 阻塞主线程,直到 observable 完成,您将看到您期望的输出。

    【讨论】:

      猜你喜欢
      • 2021-11-11
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多