我对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?"为true。那么,我如何使该代码以及所有后续尝试在一个单独的线程上运行(而不是UI线程),并且无需编写大量排队工作的代码来实现顺序执行?
编辑:
我相信现在可以使用Schedulers.single()
来完成这个任务,或者如果您想要自己创建,可以使用new SingleScheduler()
。我仍在测试,但我认为它可以实现我之前发布问题时所期望的功能。
Scheduler
上进行订阅(Schedulers
类包含用于创建它们的静态工厂方法)。然后你需要在主线程Scheduler
上进行观察,可以通过RxAndroid中的AndroidSchedulers.mainThread()
方法获取。 - corsair992ThreadPoolExecuter
),并将其池大小设置为1 (Executors.newSingleThreadExecutor()
),然后使用它通过Schedulers.from()
方法生成调度器。或者,你可以创建一个带有运行Looper
(例如HandlerThread
)的自定义线程(Thread
),并将在该Looper
上运行的Handler
传递给AndroidSchedulers.handlerThread()
方法,以获取将在该线程上操作的Scheduler
。 - corsair992Executors.newSingleThreadExecutor()
看起来正好符合我的需求。谢谢。如果您想将其放入答案中,我很乐意将其标记为已回答。 - casolorz