Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rx java 在背景线程上可观察到的进程_Rx Java_Rx Android - Fatal编程技术网

Rx java 在背景线程上可观察到的进程

Rx java 在背景线程上可观察到的进程,rx-java,rx-android,Rx Java,Rx Android,我正在使用RxAndroid进行流操作。在我的实际用例中,我从服务器获取一个列表(使用改型)。我正在使用调度程序在后台线程上完成工作,并在Android UI(主)线程上获得最终发布 这对网络呼叫很有效,但是我意识到我的操作员在网络呼叫后不使用后台线程,而是在主线程上被呼叫 myService.fetchSomeIntegersFromServer() .subscribeOn(Schedulers.newThread()) .observeOn(AndroidS

我正在使用RxAndroid进行流操作。在我的实际用例中,我从服务器获取一个列表(使用改型)。我正在使用调度程序在后台线程上完成工作,并在Android UI(主)线程上获得最终发布

这对网络呼叫很有效,但是我意识到我的操作员在网络呼叫后不使用后台线程,而是在主线程上被呼叫

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

如何确保所有操作都在后台线程上执行;DR:移动
observeOn(AndroidSchedulers.mainThread())
过滤器(…)
下面


subscribeOn(…)
用于指定可观察的
将在哪个线程上开始操作。对
subscribeOn
的后续调用将被忽略

因此,如果要编写以下内容,所有内容都将在调度器上执行。newThread()

当然,这不是您想要的:您想要在主线程上
doSomething

这就是
observeOn
成立的地方。
observeOn
之后的所有操作都在该计划程序上执行。因此,在您的示例中,
过滤器
在主线程上执行

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .subscribe(integer1 -> {});
相反,将
observeOn
向下移动到
subscribe
之前:

myService.fetchSomeIntegersFromServer()
        .subscribeOn(Schedulers.newThread())
        .filter(integer -> {
            System.out.println(Looper.getMainLooper().getThread() == Thread.currentThread());
            return true;
        })
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(integer1 -> { doSomething(integer1) });
现在,
filter
将发生在“新线程”上,而
doSomething
将发生在主线程上

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

更进一步,您可以多次使用
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将发生在主线程上

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

查看官方文档。

谢谢您的详细回答!是否有一种方法可以在方法调用链的开始(如OP)定义调度器?可观察对象遵循方法调用链,因此根据设计,这是不可能的
observeOn
(以及其他方法)不会像构建器模式那样返回相同的
Observable
实例,而是返回一个新的
Observable
“包装”旧的
Observable
。我理解这一点。这种情况很不幸,因为这意味着我必须为我编写的每个流添加
observeOn()
调用:(非常详细和有用的答案。谢谢。非常好的答案,10倍!