Malwinder Singh :
Is there any way to execute multiple requests in sequence in Retrofit?
These requests uses same Java interface and differ only by parameters they take which are contained in ArrayList
.
For requests A1, A2, A3, A4, A5...... An
Hit A1,
onResponse()
of A1 is calledHit A2,
onResponse()
of A2 is calledHit A3 .
.
.
.
.
.
onResponse()
of An is called.
azizbekian :
The problem can be easily solved with RxJava.
Assuming you have a retrofit Api
class, that returns a Completable
:
interface Api {
@GET(...)
fun getUser(id: String): Completable
}
Then you can perform this:
// Create a stream, that emits each item from the list, in this case "param1" continued with "param2" and then "param3"
Observable.fromIterable(listOf("param1", "param2", "param3"))
// we are converting `Observable` stream into `Completable`
// also we perform request here: first time parameter `it` is equal to "param1", so a request is being made with "param1"
// execution will halt here until responce is received. If response is successful, only then a call with second param ("param2") will be executed
// then the same again with "param3"
.flatMapCompletable { api.getUser(it) }
// we want request to happen on a background thread
.subscribeOn(Schedulers.io())
// we want to be notified about completition on UI thread
.observeOn(AndroidSchedulers.mainThread())
// here we'll get notified, that operation has either successfully performed OR failed for some reason (specified by `Throwable it`)
.subscribe({ println("completed") }, { println(it.message) })
If your retrofit API does not return a Completable
, then change api.getUser(it)
to api.getUser(it).toCompletable()
.
Guess you like
Origin http://10.200.1.11:23101/article/api/json?id=469764&siteId=1