Multiple similar requests in sequence in retrofit

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

  1. Hit A1,

  2. onResponse() of A1 is called

  3. Hit A2,

  4. onResponse() of A2 is called

  5. Hit 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