Skip to content

Commit 6cf22a4

Browse files
Clear implementations of first three exercises for coroutines course
1 parent d6820f5 commit 6cf22a4

File tree

3 files changed

+7
-118
lines changed

3 files changed

+7
-118
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,14 @@
11
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase2
22

3-
import androidx.lifecycle.viewModelScope
43
import com.lukaslechner.coroutineusecasesonandroid.base.BaseViewModel
54
import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
6-
import kotlinx.coroutines.launch
75

86
class Perform2SequentialNetworkRequestsViewModel(
97
private val mockApi: MockApi = mockApi()
108
) : BaseViewModel<UiState>() {
119

1210
fun perform2SequentialNetworkRequest() {
13-
uiState.value = UiState.Loading
14-
viewModelScope.launch {
15-
try {
16-
val recentVersions = mockApi.getRecentAndroidVersions()
17-
val mostRecentVersion = recentVersions.last()
18-
19-
val featuresOfMostRecentVersion =
20-
mockApi.getAndroidVersionFeatures(mostRecentVersion.apiLevel)
21-
22-
uiState.value = UiState.Success(featuresOfMostRecentVersion)
23-
} catch (exception: Exception) {
24-
uiState.value = UiState.Error("Network Request failed")
25-
}
26-
}
11+
// TODO: Exercise 1
12+
// switch to branch "coroutine_course_full" to see solution
2713
}
2814
}

app/src/main/java/com/lukaslechner/coroutineusecasesonandroid/usecases/coroutines/usecase3/PerformNetworkRequestsConcurrentlyViewModel.kt

Lines changed: 2 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@ package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase3
33
import androidx.lifecycle.viewModelScope
44
import com.lukaslechner.coroutineusecasesonandroid.base.BaseViewModel
55
import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
6-
import kotlinx.coroutines.async
7-
import kotlinx.coroutines.awaitAll
86
import kotlinx.coroutines.launch
97

108
class PerformNetworkRequestsConcurrentlyViewModel(
@@ -29,51 +27,7 @@ class PerformNetworkRequestsConcurrentlyViewModel(
2927
}
3028

3129
fun performNetworkRequestsConcurrently() {
32-
uiState.value = UiState.Loading
33-
34-
val oreoFeaturesDeferred = viewModelScope.async { mockApi.getAndroidVersionFeatures(27) }
35-
val pieFeaturesDeferred = viewModelScope.async { mockApi.getAndroidVersionFeatures(28) }
36-
val android10FeaturesDeferred =
37-
viewModelScope.async { mockApi.getAndroidVersionFeatures(29) }
38-
39-
viewModelScope.launch {
40-
try {
41-
val versionFeatures =
42-
awaitAll(oreoFeaturesDeferred, pieFeaturesDeferred, android10FeaturesDeferred)
43-
uiState.value = UiState.Success(versionFeatures)
44-
} catch (exception: Exception) {
45-
uiState.value = UiState.Error("Network Request failed")
46-
}
47-
}
48-
49-
/*
50-
51-
Alternatively:
52-
53-
viewModelScope.launch {
54-
try {
55-
// we need to wrap this code with a coroutineScope block
56-
// otherwise the app would crash on unsuccessful network requests
57-
coroutineScope {
58-
val oreoFeaturesDeferred = async { mockApi.getAndroidVersionFeatures(27) }
59-
val pieFeaturesDeferred = async { mockApi.getAndroidVersionFeatures(28) }
60-
val android10FeaturesDeferred = async { mockApi.getAndroidVersionFeatures(29) }
61-
62-
val oreoFeatures = oreoFeaturesDeferred.await()
63-
val pieFeatures = pieFeaturesDeferred.await()
64-
val android10Features = android10FeaturesDeferred.await()
65-
66-
val versionFeatures = listOf(oreoFeatures, pieFeatures, android10Features)
67-
68-
// other alternative: (but slightly different behavior when a deferred fails, see docs)
69-
// val versionFeatures = awaitAll(oreoFeaturesDeferred, pieFeaturesDeferred, android10FeaturesDeferred)
70-
71-
uiState.value = UiState.Success(versionFeatures)
72-
}
73-
74-
} catch (exception: Exception) {
75-
uiState.value = UiState.Error("Network Request failed")
76-
}
77-
}*/
30+
// TODO: Exercise 2
31+
// switch to branch "coroutine_course_full" to see solution
7832
}
7933
}
Lines changed: 3 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package com.lukaslechner.coroutineusecasesonandroid.usecases.coroutines.usecase7
22

3-
import androidx.lifecycle.viewModelScope
43
import com.lukaslechner.coroutineusecasesonandroid.base.BaseViewModel
54
import com.lukaslechner.coroutineusecasesonandroid.mock.MockApi
6-
import kotlinx.coroutines.*
7-
import timber.log.Timber
85

96
class TimeoutAndRetryViewModel(
107
private val api: MockApi = mockApi()
@@ -15,57 +12,9 @@ class TimeoutAndRetryViewModel(
1512
val numberOfRetries = 2
1613
val timeout = 1000L
1714

18-
val oreoVersionsDeferred = viewModelScope.async {
19-
retryWithTimeout(numberOfRetries, timeout) {
20-
api.getAndroidVersionFeatures(27)
21-
}
22-
}
15+
// TODO: Exercise 3
16+
// switch to branch "coroutine_course_full" to see solution
2317

24-
val pieVersionsDeferred = viewModelScope.async {
25-
retryWithTimeout(numberOfRetries, timeout) {
26-
api.getAndroidVersionFeatures(28)
27-
}
28-
}
29-
30-
viewModelScope.launch {
31-
try {
32-
val versionFeatures = listOf(
33-
oreoVersionsDeferred,
34-
pieVersionsDeferred
35-
).awaitAll()
36-
37-
uiState.value = UiState.Success(versionFeatures)
38-
39-
} catch (e: Exception) {
40-
Timber.e(e)
41-
uiState.value = UiState.Error("Network Request failed")
42-
}
43-
}
44-
}
45-
46-
private suspend fun <T> retryWithTimeout(
47-
numberOfRetries: Int,
48-
timeout: Long,
49-
block: suspend () -> T
50-
) = retry(numberOfRetries) {
51-
withTimeout(timeout) {
52-
block()
53-
}
54-
}
55-
56-
private suspend fun <T> retry(
57-
numberOfRetries: Int,
58-
delayBetweenRetries: Long = 100,
59-
block: suspend () -> T
60-
): T {
61-
repeat(numberOfRetries) {
62-
try {
63-
return block()
64-
} catch (exception: Exception) {
65-
Timber.e(exception)
66-
}
67-
delay(delayBetweenRetries)
68-
}
69-
return block() // last attempt
18+
// run api.getAndroidVersionFeatures(27) and api.getAndroidVersionFeatures(28) in parallel
7019
}
7120
}

0 commit comments

Comments
 (0)