使用函数在后台线程上使用 RxJava Observables 生成对象
Using a function to generate on object on a background thread using RxJava Observables
我正在研究 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 运行s 在后台线程上,B 运行s 在主线程上。
我的问题是,这似乎很合理,但是有没有更优雅的方法来做到这一点?
defer
是一种足够好的方法,但是使用可选的 RxAsyncUtil 库,您可以使用稍微好一点的 fromFunc0
,像这样:
Observable.fromFunc0(() -> db.query(...))
.subscribeOn(... etc.
此外,您不必使用 Subscribers.create
,因为订阅的主要重载之一对 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) })
似乎是一个非常紧凑的实现。 :)
我正在研究 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 运行s 在后台线程上,B 运行s 在主线程上。
我的问题是,这似乎很合理,但是有没有更优雅的方法来做到这一点?
defer
是一种足够好的方法,但是使用可选的 RxAsyncUtil 库,您可以使用稍微好一点的 fromFunc0
,像这样:
Observable.fromFunc0(() -> db.query(...))
.subscribeOn(... etc.
此外,您不必使用 Subscribers.create
,因为订阅的主要重载之一对 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) })
似乎是一个非常紧凑的实现。 :)