如何使用RxJava串行执行多个Retrofit请求?
实现Retrofit请求的串行执行
你的问题核心是要把原来并行的请求改成串行依次执行,RxJava里有两种简单的方式可以实现,我给你详细说下:
方法一:用concatMap替代flatMap
concatMap是RxJava专门用来保证顺序执行的操作符,它会严格等待前一个Observable完成(无论是成功还是错误)之后,才会订阅并执行下一个请求,完美符合你的需求。
修改后的代码如下:
idsList .subscribeOn(scheduler.computation()) .observeOn(scheduler.ui()) .flatMapIterable { ids -> ids } // 把flatMap换成concatMap即可 .concatMap { id -> requestEmployeeData(id) } .subscribe( { success -> println("success") }, { error -> error.printStackTrace() } )
方法二:给flatMap设置并发数为1
如果你不想替换操作符,也可以在原来的flatMap里指定maxConcurrency参数为1,强制限制同时只能有1个请求在执行,达到串行效果:
idsList .subscribeOn(scheduler.computation()) .observeOn(scheduler.ui()) .flatMapIterable { ids -> ids } // 设置maxConcurrency=1,限制并发数为1 .flatMap({ id -> requestEmployeeData(id) }, maxConcurrency = 1) .subscribe( { success -> println("success") }, { error -> error.printStackTrace() } )
为什么原来的代码会并行?
原来的flatMap默认没有并发数限制(或者说默认并发数很高),它会一次性订阅所有由requestEmployeeData(id)生成的Observable,所以所有请求会同时发起,这就是你看到的并行现象。
两种方法都能实现串行,个人更推荐第一种concatMap,因为它的语义更明确,一看就知道是要保证顺序执行的逻辑。
内容的提问来源于stack exchange,提问作者Tarcisio Wensing
相关产品推荐
相关产品推荐

