我在玩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) })


似乎是一个非常严格的实现。 :)

10-08 13:09