rx-java – 后台线程上的进程可观察

前端之家收集整理的这篇文章主要介绍了rx-java – 后台线程上的进程可观察前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Rx Android进行流操作.在我真正的用例中,我从服务器获取一个列表(使用Retrofit).我正在使用调度程序在后台线程上完成工作,并在Android UI(主)线程上获得最终的排放.

这对网络调用很好,但是我意识到我的操作符在网络调用后不使用后台线程,而是在主线程上调用.

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .subscribe(integer1 -> {});

我如何确保所有操作都在后台线程上执行?

解决方法

TL; DR:move observeOn(AndroidSchedulers.mainThread())在filter(…)下面.

subscribeOn(…)用于指定Observable将开始运行的线程.对subscribeOn的后续调用将被忽略.

因此,如果要编写以下内容,则将在Schedulers.newThread()上执行所有操作:

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .subscribe(integer1 -> { doSomething(integer1); });

现在,这当然不是你想要的:你想在主线程上做一些.
那就是观察到的地方. observeOn之后的所有操作都在该调度程序上执行.因此,在您的示例中,过滤器在主线程上执行.

相反,将观察移动到订阅之前:

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(integer1 -> { doSomething(integer1) });

现在,过滤器将发生在“新线程”上,并在主线程上执行doSomething.

要进一步,可以多次使用observeOn:

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .observeOn(Schedulers.computation())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(integer1 -> { doSomething(integer1) });

在这种情况下,抓取将发生在新线程上,对计算线程进行过滤,并在主线程上执行doSomething.

结账ReactiveX – SubscribeOn operator为官方文件.

猜你在找的Java相关文章