操作线程RxJava的有效方法

时间:2015-09-28 14:53:02

标签: java android multithreading rx-java

在我的项目中,我需要处理不同线程中的对象。为了操纵流的行为,我创建了新的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中,有更多美观有效的方法可以在不同的线程中处理一个响应。我试着谷歌,但我没有找到任何东西。

谢谢,
安东

1 个答案:

答案 0 :(得分:3)

在Rx中,通常建议避免在“做”中使用副作用。块(只有在订阅了流时才会执行),并且更喜欢订阅代码。

在您的情况下,您可以使用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(),代码完全相同,但您可以通过连接来决定何时触发查询(之后调用query.connect()连接2个订阅)。

如果您的订阅工作是后台计算,Schedulers.computation()可能优先于Schedulers.io()

请注意,AFAICT您的代码可以在没有map(Observable::just)行的情况下正常工作,因为观察到'语句只会进一步影响流(而不是之前的“语句”)