RxJava 单后台线程调度器

RxJava single background thread scheduler

我对 RxJava 还很陌生,所以这可能是个愚蠢的问题。我将描述我的场景。

我在 UI 线程上有一些代码 运行ning 会更新一些图像,但这些图像不是很重要,它们在生成它们时会消耗一些资源,所以我想生成它们在单个线程上(当然不是 UI 线程)并一个一个地生成它们。我猜蹦床调度程序是我想要的,但我的问题是,如果我使用它,那么它会在 UI 线程上完成工作,而我希望它在另一个线程上完成。

显然我可以编写自己的线程,在其中我可以对项目进行排队,然后它会一个接一个地处理这些项目,但我想也许 RxJava 会为我提供一个简单的解决方案?

我当前的代码如下所示:

Observable<Bitmap> getImage = Observable.create(new Observable.OnSubscribe<Bitmap>() {
    @Override public void call(Subscriber<? super Bitmap> subscriber) {
        Log.w(TAG,"On ui thread? "+ UIUtils.isRunningOnUIThread());
        subscriber.onNext(doComplexTaskToGetImage());
        subscriber.onCompleted();
    }
});

getImage.subscribeOn(Schedulers.trampoline()).subscribe(new Action1<Bitmap>() {
    @Override public void call(Bitmap bitmap) {
        codeToSetTheBitmap(bitmap);
    }
});

我的日志 "On ui thread?" 总是正确的。那么,如何在不编写一堆代码来排队该工作的情况下,如何使该代码以及所有后续尝试在单个线程(而不是 ui 线程)上按顺序执行相同的操作 运行 呢?

编辑:

我相信现在可以使用 Schedulers.single() 来完成,或者如果您想要自己的,可以使用 new SingleScheduler()。我仍在测试,但我认为它可以满足我发布此内容时的要求。

您可以通过以下方式之一创建一个可重复使用的线程来为 Observable 创建一个 Scheduler

  • 创建一个池大小为 1 的 ThreadPoolExecuterExecutors.newSingleThreadExecutor() 是一个方便的静态工厂方法),然后使用它通过 Schedulers.from() 方法生成调度程序.
  • RxAndroid 提供自定义 Scheduler 实现,它使用 Handler 来安排操作,因此可以与具有 [=18] 的任何 Thread 一起使用=] 运行 通过将它的 Handler 传递给 AndroidSchedulers.handlerThread() 工厂方法。

请注意,如果您在这些任务结束时与 UI 交互,则需要在主线程 Scheduler 上进行观察。

在 RxJava 2 中你可以使用 Schedulers.single() 其中:

Returns a default, shared, single-thread-backed Scheduler instance for work requiring strongly-sequential execution on the same background thread.

see the documentation了解更多详情。

我看不到它在 RxJava 1 中可用 Schedulers documentation

您正在使用 trampoline 调度程序,因此这意味着您的源可观察对象将 运行 在当前线程(这里是主线程)上。

并且 subscribeOn 将适用于上游和下游。这就是为什么您的日志显示您在 main thread

运行ning

要解决此问题,您可以在 subscribeOn 中使用 Schedulers.single(),然后在主线程中使用 observeOn