0

I have a list of users and I need to save users one by one via API call. I tried the below code and it sends the same user for all API calls.

gradle

implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava2:rxkotlin:2.4.0'

kotlin

data class User(val name: String, val age: Int)

fun saveUsers(users: MutableList<User>) {
    var index = 0
    compositeDisposable.add(userRepository.saveUser(users[index])
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnSubscribe {
            // do something
        }.doFinally {
            // do something
        }.repeatWhen { it.delay(1, TimeUnit.SECONDS) }
        .repeatUntil {
            users.size -1 == index
        }.subscribe({
            if ( users.size -1 == index) {
                // do something
            } else {
                index++
                // do something
            }
        }, {
            it.printStackTrace()
        }))
}

userRepository.saveUser() method returns Single<ResultResponse>

class ResultResponse(
    val ResultCode: Int = -1
)

Can you please give me a solution for these multiple API calls?

AndroidDev
  • 35
  • 5

2 Answers2

2

You can call multiple requests sequently with the Observable.fromIterable method.
Solution:

compositeDisposable.add(
    Observable.fromIterable(users)
        .map { user -> userRepository.saveUser(user) }
        .doOnComplete {
            // Called after saving all users
        }
        .subscribe({ user ->
            // Called after saving each user
        }, {
            // Called on error
        })
)
Alexander
  • 316
  • 1
  • 7
1

Great answer from @Alexander. As I can see you need the index of the current user for some reason I have also added the code where you will also be able to get the current index of the saved user inside onNext block.

fun saveUsers(users: MutableList<User>) {
    val disposable = Observable.fromIterable(users.withIndex())
        .flatMap { (index, user) ->
            Observable.zip(Observable.just(index), saveUser(user).toObservable()) { index, response ->
                index to response
            }
        }
        .doOnSubscribe {
            // do something
        }.doFinally {
            // do something
        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(/* onNext = */ { (index, user) ->
            if ( users.size - 1 == index) {
                // do something
            } else {
                // do something
            }
        }, /* onError = */ {
            // do something
        }, /* onComplete = */ {
            // do something
        })
    compositeDisposable.add(disposable)
}
Alif Hasnain
  • 1,176
  • 1
  • 11
  • 24