RxJava 单后台线程调度程序

2022-09-01 23:11:24

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

我在UI线程上运行了一些代码,这些代码将更新一些图像,但这些图像不是很重要,它们在生成它们时会消耗一些资源,所以我想在单个线程(当然不是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);
    }
});

我的日志显示“在 ui 线程上?”始终为 true。那么,如何使该代码以及随后所有尝试在单个线程(而不是ui线程)上运行相同的操作,而无需编写一堆代码来排队?

编辑:

我相信这现在可以使用来完成,或者如果您想要自己的,则可以使用。我仍在测试,但我认为当我发布这个时,它做了我想要的。Schedulers.single()new SingleScheduler()


答案 1

您可以通过以下方式之一创建单个可重用线程来为 创建一个:SchedulerObservable

  • 创建一个池大小为 1 的 (是一种方便的静态工厂方法),然后使用它通过该方法生成调度程序。ThreadPoolExecuterExecutors.newSingleThreadExecutor()Schedulers.from()
  • RxAndroid 提供了一个自定义实现,该实现使用 a 来计划操作,因此可以通过将其传递给工厂方法与任何具有运行的方法一起使用。SchedulerHandlerThreadLooperHandlerAndroidSchedulers.handlerThread()

请注意,在这些任务结束时,您需要在主线程上观察是否与 UI 交互。Scheduler


答案 2

在 RxJava 2 中,您可以使用以下命令:Schedulers.single()

返回默认的、共享的、单线程支持的计划程序实例,用于需要在同一后台线程上执行强顺序的工作。

有关更多详细信息,请参阅文档

我在 RxJava 1 Schedulers 文档中看不到它。


推荐