-
Notifications
You must be signed in to change notification settings - Fork 22
Concurrent network request
Devrath edited this page Jun 15, 2021
·
1 revision
- Performs three network requests concurrently.
- It loads the feature information of the 3 most recent Android Versions.
- Additionally, an implementation that performs the requests sequentially is included.
- The UI shows how much time each implementation takes to load the data so you can see that the network requests in the concurrent version are actually performed in parallel.
- The included unit test is also interesting, as it shows how you can use the virtual time to verify that the concurrent version really gets performed in parallel.
class PerformNetworkRequestsConcurrentlyViewModel(
private val mockApi: MockApi = mockApi()
) : BaseViewModel<UiState>() {
fun performNetworkRequestsSequentially() {
uiState.value = UiState.Loading
viewModelScope.launch {
try {
val oreoFeatures = mockApi.getAndroidVersionFeatures(27)
val pieFeatures = mockApi.getAndroidVersionFeatures(28)
val android10Features = mockApi.getAndroidVersionFeatures(29)
val versionFeatures = listOf(oreoFeatures, pieFeatures, android10Features)
uiState.value = UiState.Success(versionFeatures)
} catch (exception: Exception) {
uiState.value = UiState.Error("Network Request failed")
}
}
}
fun performNetworkRequestsConcurrently() {
uiState.value = UiState.Loading
val oreoFeaturesDeferred = viewModelScope.async { mockApi.getAndroidVersionFeatures(27) }
val pieFeaturesDeferred = viewModelScope.async { mockApi.getAndroidVersionFeatures(28) }
val android10FeaturesDeferred =
viewModelScope.async { mockApi.getAndroidVersionFeatures(29) }
viewModelScope.launch {
try {
val versionFeatures =
awaitAll(oreoFeaturesDeferred, pieFeaturesDeferred, android10FeaturesDeferred)
uiState.value = UiState.Success(versionFeatures)
} catch (exception: Exception) {
uiState.value = UiState.Error("Network Request failed")
}
}
}
}