android - 使用函数在后台线程上使用 RxJava Observables 生成对象

标签 android multithreading rx-java

我正在研究 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/

相关文章:

java - 了解 Future 的可中断取消

c++ - V8 目前是线程安全的吗?

android - 使用 RxJava 在 RecyclerView 上更新 UI(加载和错误 View )

java - 显示收到的推送通知

java - 在 Android/Java 中可以将代码传递给服务类吗?

java - ksoap2 具有相似命名空间但类型不同的嵌套项

android - Android Studio 中的 Gradle 无法解析 JCenter 中的库

java - Log4j2 中 AsyncLogger 和 AsyncAppender 的区别

java - FutureCallback 到 Observable

java - 可观察链死亡和 Intellij 滞后/卡住