我在玩RxJava,试图弄清楚如何在后台线程上运行方法并处理前台线程上的结果。我偶然发现了一个解决方案,但想进行一次健全性检查,看看是否有更好的方法,因为似乎有很多不同的方法可以使Observable组成类似的事情。
这是我所拥有的:
Observable.defer(
() -> Observable.just(
// A. Should run on Scheduler.newThread
db.query(
false, DATABASE_TABLE, null,
null, null, null, null, null,
null)))
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
Subscribers.create(
// B. Should run on AndroidSchedulers.mainThread
cursor -> adapter.swapCursor(cursor)
));
该代码按预期工作。 A在后台线程上运行,而B在主线程上运行。
我的问题是,这似乎足够合理,但是有没有更优雅的方法呢?
最佳答案
defer
是一种足够体面的方法,但是有了可选的RxAsyncUtil lib,您可以使用稍微好一点的fromFunc0
,如下所示:
Observable.fromFunc0(() -> db.query(...))
.subscribeOn(... etc.
同样,您不必使用
Subscribers.create
,因为订阅的主要重载之一对onNext
只需执行一个操作。因此,您的订阅可能变为:
.subscribe(cursor -> { adapter.swapCursor(cursor) })
(不能100%地确定
{}
是否对于java8 lambdas是必需的。如果swapCursor为void,则可能不是必需的……尝试两者吗?)因此,一起:
Observable.fromFunc0(() -> db.query(
false, DATABASE_TABLE, null, null, null, null, null, null, null))
.scheduleOn(Schedulers.newThread())
.observeOn(Schedulers.mainThread())
.subscribe(cursor -> { adapter.swapCursor(cursor) })
似乎是一个非常严格的实现。 :)