findallAsync()。asFlowable()之后的运算符正在UI线程上运行

时间:2017-11-02 11:05:40

标签: android realm rx-java2

我遇到问题,rxjava运算符正在UI线程中运行。 我使用findAllAsync()异步获取对象,并使用asFlowable()用rxjava运算符处理它们。

realm.where(Specie.class)
            .equalTo("fauna", true)
            .findAllAsync().asFlowable()
            .filter(new Predicate<RealmResults<Specie>>() {
                @Override
                public boolean test(RealmResults<Specie> species) throws Exception {
                    System.out.println("THREAD : " + Thread.currentThread().getId()); // Print 1
                    return species.isLoaded();
                }
            })

但是在领域rxjava示例中他们使用observeOn(AndroidSchedulers.mainThread()),这意味着先前的运算符是异步运行的,否则它将是无用的。 链接:https://github.com/realm/realm-java/blob/master/examples/rxJavaExample/src/main/java/io/realm/examples/rxjava/animation/AnimationActivity.java

disposable = realm.where(Person.class).findAllAsync().asFlowable()
            .flatMap(persons -> Flowable.fromIterable(persons))
            .zipWith(Flowable.interval(1, TimeUnit.SECONDS), (person, tick) -> person)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(person -> {
                TextView personView = new TextView(AnimationActivity.this);
                personView.setText(person.getName());
                container.addView(personView);
            });

如何在asFlowable()之后异步运行运算符?

  

编辑:如何访问在UI线程上获取的RealmResults   后台线程?

1 个答案:

答案 0 :(得分:1)

Schedulers.computation()上的执行,因此他们添加observeOn(AndroidSchedulers.mainThread())以返回主线程。

Realm Async Query API自己处理查询的异步评估,Realm将该查询的结果传回UI线程,即isLoaded()为真。

要离开主线程,您可以使用observeOn(Schedulers.io())作为示例。