我对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()
。我还在测试,但是当我发布这个帖子时,我认为它确实符合我的要求。
答案 0 :(得分:13)
您可以通过以下方式之一创建单个可重复使用的线程,为Scheduler
创建Observable
:
ThreadPoolExecuter
(Executors.newSingleThreadExecutor()
是一种方便的静态工厂方法),然后使用它通过Schedulers.from()
方法生成调度程序。 / LI>
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
。