使用函数在后台线程上使用 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) })

似乎是一个非常紧凑的实现。 :)