6つのAPI呼び出しを同時に実行する必要があり、対応するリクエストが終了したときにそれぞれのUIを更新する必要があります
現在、次のコードを使用してkotlinコルーチン並列実行を使用しています
suspend fun getAllData() : List<String>{
return withContext(Dispatchers.IO) {
lateinit var getObject1Task: Deferred<Response<String>>
lateinit var getObject2Task: Deferred<Response<String>>
lateinit var getObject3Task: Deferred<Response<String>>
lateinit var getObject4Task: Deferred<Response<String>>
lateinit var getObject5Task: Deferred<Response<String>>
lateinit var getObjec6Task: Deferred<Response<String>>
launch {
getObject1Task = dataApiService.getData()
getObject2Task = dataApiService.getData()
getObject3Task = dataApiService.getData()
getObject4Task = dataApiService.getData()
getObject5Task = dataApiService.getData()
getObject6Task = dataApiService.getData()
}
var stringList = ArrayList<String >()
stringList.add(getObject1Task.await().body()!!) /// add All to the list
stringList
}
}
APIが終了するとすぐに、各文字列のデータを取得する方法を見つけることができません。私も試しましたLiveDataですが、それがどういう意味で意味があるのか。
各文字列には他の文字列とのリンクがないため、リストにすべての文字列を追加する必要はありません
APIが相互に関連していない場合は、APIごとに新しいコルーチンを起動します。コルーチンは軽量なので、必要な数だけ起動できます。
6つのAPIがあるので、一度に6つのコルーチンを起動し、対応するコルーチンでそれらの応答を処理します。
また、MVVMをフォローしたいので、LiveDataを使用してviewModelからフラグメントまたはアクティビティにデータを渡すことができます。
ViewModelでは、次のようになります
// liveDatas for passing data to your fragment or activity
// each liveData should be observed and update their respective views
val object1LiveData = MutableLiveData<String>()
val object2LiveData = MutableLiveData<String>()
val object3LiveData = MutableLiveData<String>()
val object4LiveData = MutableLiveData<String>()
val object5LiveData = MutableLiveData<String>()
val object6LiveData = MutableLiveData<String>()
private val listOfLiveData = listOf(
object1LiveData,
object2LiveData,
object3LiveData,
object4LiveData,
object5LiveData,
object6LiveData
)
fun fetchData(){
listOfLiveData.forEach { liveData->
// launching a new coroutine for every liveData
// for parellel execution
viewModelScope.launch{
callApiAndUpdateLiveData(liveData)
}
}
}
private suspend fun callApiAndUpdateLiveData(liveData: MutableLiveData<String>){
val response = dataApiService.getData().await()
liveData.value = response.body()!!
}