I want to invoke one Completable after another. That is when first is finished, invoke second and when the second is finished, invoke the third one. I already tried some different stuff like andThen(), but found out it does not "wait" for previous Completable to finish as it runs parallel. So far, this is what I have found and it works as I wanna, but is there any better way to improve this. Is there any operation function or something to get rid of Completable.defer at every stage?
Here is so far working example:
   private fun invokeAllThreeDoSomeLogic() {
        
        disposable.add(Completable.concatArray(
                Completable.defer {
                    firstApi.getData().doOnError { t: Throwable? ->
                        Timber.w(
                            t,
                            "first error"
                        )
                    }
                },
                Completable.defer {
                    Completable.fromObservable(secondApi.getData()
                        .doOnError { t: Throwable? ->
                            Timber.i(
                                t,
                                "Second error"
                            )
                        }
                },
                Completable.defer {
                    thirdApi.refresh().doOnError { t: Throwable? ->
                        Timber.i(
                            t,
                            "Third error"
                        )
                    }
                }
            ).subscribe(
                { },
                { t: Throwable? ->
                    Timber.w(t, "something went wrong")
                })
        )
    }
 
    