RxJava单个后台线程调度程序

cas*_*orz 17 java android rx-java rx-android

我对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);
    }
});
Run Code Online (Sandbox Code Playgroud)

我的日志上写着"On ui thread?" 永远都是如此.那么我如何使代码和所有后续尝试做同样的事情按顺序在单个线程(而不是ui线程)上运行而不编写一堆代码来排队工作?

编辑:

我相信现在可以使用Schedulers.single()或者如果你想要你自己可以使用它new SingleScheduler().我还在测试,但是当我发布这个帖子时,我认为它确实符合我的要求.

cor*_*992 15

您可以创建一个可重复使用的线程创建SchedulerObservable以下列方式之一:

  • 创建一个ThreadPoolExecuter池大小为1(这Executors.newSingleThreadExecutor()是一个方便的静态工厂方法),然后使用它通过该Schedulers.from()方法生成调度程序.
  • RxAndroid提供了一个自定义Scheduler实现,它使用a Handler来调度操作,因此可以通过将其传递给factory方法与任何ThreadLooper运行的实现Handler一起使用AndroidSchedulers.handlerThread().

请注意,Scheduler如果您在完成这些任务时与UI进行交互,则需要在主线程上进行观察.

  • 我想念rxjava中的`Schedulers.singleThread()`方法,就像它的`newThread()`一样. (6认同)
  • @AlvaroGutierrezPerez RxJava 2 有一个新的`Schedulers.single()`。 (2认同)

Alb*_*lvo 12

在RxJava 2中,您可以使用以下Schedulers.single()内容:

返回默认的,共享的,单线程支持的Scheduler实例,用于需要在同一后台线程上执行强序执行的工作.

有关更多详细信息,请参阅文档.

我在RxJava 1 Schedulers文档中看不到它.

  • 但是 single() 不是总是返回相同的调度程序吗?因此,如果您使用 single() 有 2 个不同的项目,它们将共享同一个线程,是吗?所以这不能回答问题,因为该线程不会专门用于工作 (2认同)