web-dev-qa-db-ja.com

複数のAPI呼び出しを同時に行い、対応するリクエストの処理が終了するとすぐにUIを更新しますAndroid

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ですが、それがどういう意味で意味があるのか​​。

各文字列には他の文字列とのリンクがないため、リストにすべての文字列を追加する必要はありません

3
Syeda Zunaira

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()!!
}
0
Pavan Varma