操作线程RxJava的有效方法

前端之家收集整理的这篇文章主要介绍了操作线程RxJava的有效方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在我的项目中,我需要处理不同线程中的对象.为了操纵流的行为,我创建了新的observable来以这种方式改变他们的observeOn():

apiService.getObjects(token) // Retrofit
                .compose(bindToLifecycle())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnNext(o -> {
                    // process in Main Thread
                })
                .map(Observable::just)  // create new one,to change thread for it
                .observeOn(Schedulers.io()) 
                .subscribe(o -> {
                    // process in the background thread
                });

但我认为在RxJava中有更多美观有效的方法来处理不同线程中的一个响应.我试着谷歌,但我没有找到任何东西.

谢谢,
安东

最佳答案
在Rx中,通常建议避免’do’块中的副作用(只有在流被订阅时才会执行),并且更喜欢订阅代码.

在您的情况下,您可以利用cache()或publish()… connect(),例如:

query = apiService.getObjects(token)
            .compose(bindToLifecycle())
            .subscribeOn(Schedulers.io())
            .cache();

query.observeOn(AndroidSchedulers.mainThread())
            .subscribe(o -> {
                // process in Main Thread
            })
query.observeOn(Schedulers.io())
            .subscribe(o -> {
                // process in the background thread
            });

使用publish()而不是cache(),代码是相同的,但您可以通过连接流来决定何时触发查询(在连接2个订阅调用query.connect()).

如果您的订阅工作是后台计算,则Schedulers.computation()可能比Schedulers.io()更受欢迎.

请注意,AFAICT您的代码将在没有map(Observable :: just)行的情况下正常工作,因为’observeOn’语句仅影响流进一步向下(而不是之前的’do’语句)

猜你在找的Android相关文章