1

just asking if I am doing it correct, because I don't know why the doOnComplete is calling while the doOnNext is not yet finish?

So that's why, I am asking on how to wait all the task inside the doOnNext before calling the doOnComplete?

The other task inside the doOnNext is the inserting of data into the database.

private val disposable = CompositeDisposable()

val branchUser : Observable<BranchUserResponse> = getApi().getBranchUser()
val areaUser : Observable<AreaUserResponse> = getApi().getAreaUser()
val regionalUser : Observable<RegionalUserResponse> = getApi().getRegionalUser()

disposable.add(
    Observable.merge(branchUser, areaUser, regionalUser)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext { it ->
            when (it) {
                is BranchUserResponse -> {
                    branchUserViewModel.addAll()
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(
                            {
                                Log.i(TAG, "addAll success")
                                // the doOnComplete is already called before the Log here is call.
                                // Same with the other condition.
                                // What I want is to call this first before the doOnComplete or doFinally.
                            },
                            {
                                Log.e(TAG, "addAll failed", it)
                            }
                        )
                }
                is AreaUserResponse -> {
                    // some stuff here...
                }
                is RegionalUserResponse -> {
                    // some stuff here...
                }
            }
        }
        .doOnComplete {
            Log.i(TAG, "Complete")
        }
        .doFinally {
            Log.i(TAG, "Finally")
        }
        .subscribe()
)

Any help is appreciated, Thanks.

dotGitignore
  • 1,597
  • 2
  • 15
  • 34

1 Answers1

1

If you are going to do rx-stuff in all branches specified in doOnNext you have to change doOnNext to flatMap:

private val disposable = CompositeDisposable()

val branchUser : Observable<BranchUserResponse> = getApi().getBranchUser()
val areaUser : Observable<AreaUserResponse> = getApi().getAreaUser()
val regionalUser : Observable<RegionalUserResponse> = getApi().getRegionalUser()

disposable.add(
    Observable.merge(branchUser, areaUser, regionalUser)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap { it ->
            when (it) {
                is BranchUserResponse -> {
                    branchUserViewModel.addAll()
                }
                is AreaUserResponse -> {
                    // some stuff here...
                }
                is RegionalUserResponse -> {
                    // some stuff here...
                }
            }
        }
        .doOnComplete {
            Log.i(TAG, "Complete")
        }
        .doFinally {
            Log.i(TAG, "Finally")
        }
        .subscribe()
)
MeliX
  • 230
  • 1
  • 6