代码之家  ›  专栏  ›  技术社区  ›  Amrmsmb

为什么onNext无效[重复]

  •  0
  • Amrmsmb  · 技术社区  · 7 年前

    如下图所示,我正在学习如何使用rxjava。我想知道如何使用map操作符来显示每个列表中有多少个人对象。 问题是,当我运行代码时,从未调用observable的onNext。

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

    请告诉我如何使用map操作符显示每个列表中有多少个人对象。

    提前谢谢

    密码 :

    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 回复  |  直到 7 年前
        1
  •  2
  •   Kiskae    7 年前

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

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