RxJava单后台线程调度程序

RxJava单后台线程调度程序,java,android,rx-java,rx-android,Java,Android,Rx Java,Rx Android,我对RxJava相当陌生,所以这可能是一个愚蠢的问题。我将描述我的情景 我在UI线程上运行了一些代码,这些代码将更新一些图像,但是这些图像不是很重要,它们在生成它们时会消耗一些资源,因此我希望在单个线程(当然不是UI线程)上生成它们,并逐个生成它们。我猜trampoline调度器就是我想要的,但我的问题是,如果我使用它,它会在UI线程上工作,我希望它在另一个线程上工作 显然,我可以编写自己的线程,在其中我可以对项目进行排队,然后它一个接一个地处理这些项目,但我想也许RxJava会为我提供一个简单

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

我在UI线程上运行了一些代码,这些代码将更新一些图像,但是这些图像不是很重要,它们在生成它们时会消耗一些资源,因此我希望在单个线程(当然不是UI线程)上生成它们,并逐个生成它们。我猜trampoline调度器就是我想要的,但我的问题是,如果我使用它,它会在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);
    }
});
Observable getImage=Observable.create(new Observable.OnSubscribe()){

@Override public void call(Subscriber您可以通过以下方式之一创建单个可重用线程,为
可观察的
创建一个
调度程序

  • 创建一个池大小为1的
    ThreadPoolExecuter
    Executors.newSingleThreadExecutor()
    是一种方便的静态工厂方法),然后使用它通过
    schedulers.from()
    方法生成调度程序
  • 提供一个自定义的
    调度程序
    实现,该实现使用
    处理程序
    来调度操作,因此可以通过将
    处理程序
    传递给
    AndroidSchedulers.handlerThread()
    工厂方法,与运行
    活套的任何
    线程一起使用

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

在RxJava 2中,可以使用调度程序。single()
,它:

返回的默认共享单线程支持调度程序实例 需要在同一背景下强顺序执行的工作 线

请查看更多详细信息


我看不到它在RxJava 1中可用。

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

subscribeOn
将同时适用于上游和下游。这就是为什么您的日志显示您正在
主线程上运行的原因


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

我已经在使用RxAndroid,我的代码显示我正在使用
subscribeOn
。我只是不知道传递给
subscribeOn
什么来完成我想要的任务。你需要在后台线程上订阅
调度程序
(包含用于创建它们的静态工厂方法)。然后您需要在主线程上观察
调度程序
,该调度程序可以通过
AndroidSchedulers.mainThread()在RxAndroid中获取
方法。我知道了,但是哪个
调度器
会给我一个后台线程,它将继续像
蹦床
调度器一样工作?你可以创建一个池大小为1的
线程池执行器(
Executors.newSingleThreadExecutor()
),然后使用它通过
schedulers.from()
方法生成调度程序。或者,您可以创建一个运行
活套
的自定义
线程
(例如
HandlerThread
),并将在该
活套
上运行的
处理程序
传递给
AndroidSchedulers.HandlerThread()
方法获取将在该线程上运行的
调度程序
。我错过了rxjava中的
调度程序.singleThread()
方法,就像它的
newThread()
方法一样。@AlvaroGutierrezPerez rxjava 2有一个新的
调度程序.single()
。但不是single()始终返回相同的调度程序?因此,如果使用single()有两个不同的项目,它们将共享同一个线程,是吗?因此,这并不能回答问题,因为该线程不会专用于job@FrankMonza当然
single()(这就是它的全部要点)。如果您想要两个独立的单线程调度程序,那么使用,如另一个答案中所解释的。