我遇到问题,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 后台线程?
答案 0 :(得分:1)
Schedulers.computation()
上的执行,因此他们添加observeOn(AndroidSchedulers.mainThread())
以返回主线程。
Realm Async Query API自己处理查询的异步评估,Realm将该查询的结果传回UI线程,即isLoaded()
为真。
要离开主线程,您可以使用observeOn(Schedulers.io())
作为示例。