RxJava单个后台线程调度程序

时间:2015-04-17 16:15:13

标签: java android rx-java rx-android

我对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);
    }
});

我的日志上写着“On ui thread?”永远都是如此。那么我如何使代码和所有后续尝试做同样的事情按顺序在单个线程(而不是ui线程)上运行而不编写一堆代码来排队工作?

编辑:

我相信现在可以使用Schedulers.single()完成此操作,或者如果您想要自己的,则可以使用new SingleScheduler()。我还在测试,但是当我发布这个帖子时,我认为它确实符合我的要求。

3 个答案:

答案 0 :(得分:13)

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

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

请注意,如果您在完成这些任务时与UI进行交互,则需要在主线程{{1}}上进行观察。

答案 1 :(得分:10)

在RxJava 2中,您可以使用Schedulers.single()

  

返回默认的,共享的,单线程支持的Scheduler实例   需要在同一背景上执行强序执行的工作   线程。

see the documentation了解详情。

我在RxJava 1 Schedulers documentation中看不到它。

答案 2 :(得分:0)

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

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

上运行的原因

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