【发布时间】:2015-06-24 14:45:08
【问题描述】:
我对 RxJava 还很陌生,所以这可能是一个愚蠢的问题。我将描述我的场景。
我在 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);
}
});
我的日志显示“在 ui 线程上?”总是有真实的。那么,如何使该代码和所有后续尝试在单个线程(而不是 ui 线程)上按顺序运行,而无需编写一堆代码来排队该工作?
编辑:
我相信现在可以使用Schedulers.single() 来完成,或者如果您想要自己的,可以使用new SingleScheduler()。我仍在测试,但我认为它可以满足我发布此内容时的要求。
【问题讨论】:
-
我已经在使用 RxAndroid 并且我的代码显示我正在使用
subscribeOn。我只是不知道将什么传递给subscribeOn来做我想做的事。 -
您需要订阅后台线程
Scheduler(Schedulersclass 包含用于创建它们的静态工厂方法)。然后你需要在主线程Scheduler上观察,可以在RxAndroid中通过AndroidSchedulers.mainThread()方法获取。 -
我明白了,但是哪个
Scheduler会给我一个后台线程,它会像trampoline调度程序一样继续重复使用? -
您可以创建一个池大小为 1 (
Executors.newSingleThreadExecutor()) 的ThreadPoolExecuter,然后通过Schedulers.from()方法使用它来生成调度程序。或者,您可以创建一个自定义Thread并运行Looper(例如HandlerThread),并将在该Looper上运行的Handler传递给AndroidSchedulers.handlerThread()方法以获得将运行的Scheduler在那个线程上。
标签: java android rx-java rx-android