RxJava 单后台线程调度器
RxJava single background thread scheduler
我对 RxJava 还很陌生,所以这可能是个愚蠢的问题。我将描述我的场景。
我在 UI 线程上有一些代码 运行ning 会更新一些图像,但这些图像不是很重要,它们在生成它们时会消耗一些资源,所以我想生成它们在单个线程上(当然不是 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()
。我仍在测试,但我认为它可以满足我发布此内容时的要求。
您可以通过以下方式之一创建一个可重复使用的线程来为 Observable
创建一个 Scheduler
:
- 创建一个池大小为 1 的
ThreadPoolExecuter
(Executors.newSingleThreadExecutor()
是一个方便的静态工厂方法),然后使用它通过 Schedulers.from()
方法生成调度程序.
- RxAndroid 提供自定义
Scheduler
实现,它使用 Handler
来安排操作,因此可以与具有 [=18] 的任何 Thread
一起使用=] 运行 通过将它的 Handler
传递给 AndroidSchedulers.handlerThread()
工厂方法。
请注意,如果您在这些任务结束时与 UI 交互,则需要在主线程 Scheduler
上进行观察。
在 RxJava 2 中你可以使用 Schedulers.single()
其中:
Returns a default, shared, single-thread-backed Scheduler instance for
work requiring strongly-sequential execution on the same background
thread.
请see the documentation了解更多详情。
我看不到它在 RxJava 1 中可用 Schedulers documentation。
您正在使用 trampoline
调度程序,因此这意味着您的源可观察对象将 运行 在当前线程(这里是主线程)上。
并且 subscribeOn
将适用于上游和下游。这就是为什么您的日志显示您在 main thread
运行ning
要解决此问题,您可以在 subscribeOn
中使用 Schedulers.single()
,然后在主线程中使用 observeOn
。
我对 RxJava 还很陌生,所以这可能是个愚蠢的问题。我将描述我的场景。
我在 UI 线程上有一些代码 运行ning 会更新一些图像,但这些图像不是很重要,它们在生成它们时会消耗一些资源,所以我想生成它们在单个线程上(当然不是 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()
。我仍在测试,但我认为它可以满足我发布此内容时的要求。
您可以通过以下方式之一创建一个可重复使用的线程来为 Observable
创建一个 Scheduler
:
- 创建一个池大小为 1 的
ThreadPoolExecuter
(Executors.newSingleThreadExecutor()
是一个方便的静态工厂方法),然后使用它通过Schedulers.from()
方法生成调度程序. - RxAndroid 提供自定义
Scheduler
实现,它使用Handler
来安排操作,因此可以与具有 [=18] 的任何Thread
一起使用=] 运行 通过将它的Handler
传递给AndroidSchedulers.handlerThread()
工厂方法。
请注意,如果您在这些任务结束时与 UI 交互,则需要在主线程 Scheduler
上进行观察。
在 RxJava 2 中你可以使用 Schedulers.single()
其中:
Returns a default, shared, single-thread-backed Scheduler instance for work requiring strongly-sequential execution on the same background thread.
请see the documentation了解更多详情。
我看不到它在 RxJava 1 中可用 Schedulers documentation。
您正在使用 trampoline
调度程序,因此这意味着您的源可观察对象将 运行 在当前线程(这里是主线程)上。
并且 subscribeOn
将适用于上游和下游。这就是为什么您的日志显示您在 main thread
要解决此问题,您可以在 subscribeOn
中使用 Schedulers.single()
,然后在主线程中使用 observeOn
。