如何在rxjava中的另一个线程中运行一个方法

时间:2017-04-27 03:37:01

标签: rx-java rx-java2

我使用Rxjava2编写了以下代码:

public class RxSchTest {

    public Observable<String> validate(String str){

        return Observable.create(s->{

            s.onNext(str+":v1");
            System.out.println("run on threads "+Thread.currentThread());
        });
    }

    @Test
    public void testbackRun(){
       // Observable<String>
        for(int i =0;i<10;i++) {
            validate("test"+i).observeOn(Schedulers.io()).subscribe(System.out::println);
        }

    }
}

输出是意料之外的:

  

在线程上运行Thread [main,5,main]

     

TEST0:V1

     

在线程上运行Thread [main,5,main]

     

test1:v1在线程上运行Thread [main,5,main]

     

TEST2:V1

     

在线程上运行Thread [main,5,main]

     

TEST3:V1

     

在线程上运行Thread [main,5,main]

     

TEST4:V1

     

在线程上运行Thread [main,5,main]

     

TEST5:V1

     

在线程上运行Thread [main,5,main]

     

TEST6:V1

     

在线程上运行Thread [main,5,main]

     

TEST7:V1

     

在线程上运行Thread [main,5,main]

     

test8:V1

     

在线程上运行Thread [main,5,main]

     

test9:V1

为什么所有观察者都在主线程上运行?

1 个答案:

答案 0 :(得分:1)

您在默认(主)线程上创建Observable,在之后创建线程切换到io。因此,只有订阅者的打印发生在io上。请记住,observeOn运算符会切换下游线程。

如果您需要使用Observable使用io运算符而不是subscribeOn订阅observeOn。{/ p>

@Test
public void testbackRun(){
    for(int i =0;i<10;i++) {
        validate("test"+i)
            .subscribeOn(Schedulers.io()) <---------------
            .subscribe(System.out::println);
    }

}

在这种情况下,整个流将在io线程上发生。