我正在研究 RxJava 并试图找出如何在后台线程上运行一个方法并在前台线程上处理结果。我偶然发现了一个解决方案,但想进行完整性检查,看看是否有更好的方法,因为似乎有很多不同的方法来组合 Observables 来做类似的事情。
这是我所拥有的:
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 库,您可以使用稍微好一点的 fromFunc0
,如下所示:
Observable.fromFunc0(() -> db.query(...))
.subscribeOn(... etc.
此外,您不必使用 Subscribers.create
,因为 subscribe 的主要重载之一对 onNext
执行单个操作。
因此,您的订阅可能会变成:
.subscribe(cursor -> { adapter.swapCursor(cursor) })
(不能 100% 确定 {}
是否是 java8 lambda 所必需的。如果 swapCursor 为空,它们可能不是必需的...两者都试试?)
所以,所有在一起:
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) })
似乎是一个非常紧凑的实现。 :)
关于android - 使用函数在后台线程上使用 RxJava Observables 生成对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28331922/