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