rx-java – 后台线程上的进程可观察
发布时间:2020-12-14 14:48:17 所属栏目:Java 来源:网络整理
导读:我正在使用Rx Android进行流操作.在我真正的用例中,我从服务器获取一个列表(使用Retrofit).我正在使用调度程序在后台线程上完成工作,并在Android UI(主)线程上获得最终的排放. 这对网络调用很好,但是我意识到我的操作符在网络调用后不使用后台线程,而是在主
我正在使用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); }); 现在,这当然不是你想要的:你想在主线程上做一些. 相反,将观察移动到订阅之前: 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为官方文件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |