Kotlin Coroutines Intro
The core functionality: Is the ability to suspend a coroutine at some point and resume it in the future.
Example Code
Code
package com.glassthought.sandbox
import gt.sandbox.util.output.Out
import kotlinx.coroutines.*
import kotlin.random.Random
// Simulating a View interface for displaying data
interface View {
suspend fun showNews(news: List<String>)
suspend fun showUser(user: String)
suspend fun showProgressBar()
suspend fun hideProgressBar()
}
val out = Out.standard()
// A simple implementation of the View interface
class ConsoleView : View {
override suspend fun showNews(news: List<String>) {
out.printlnGreen("News: $news")
}
override suspend fun showUser(user: String) {
out.printlnGreen("User: $user")
}
override suspend fun showProgressBar() {
out.printlnBlue("Loading...")
}
override suspend fun hideProgressBar() {
out.printlnBlue("Done loading.")
}
}
// Simulated functions to fetch data
suspend fun getNewsFromApi(): List<String> {
out.println("Starting news fetch...")
delay(1000L) // Simulating network delay
out.println("News fetch complete.")
return listOf("News 1", "News 2", "News 3")
}
suspend fun getUserData(): String {
out.println("Starting user data fetch...")
delay(800L) // Simulating network delay
out.println("User data fetch complete.")
return "John Doe"
}
// Suspending functions to update news and profile
suspend fun updateNews(view: View) {
view.showProgressBar()
val news = getNewsFromApi()
val sortedNews = news.sortedByDescending { Random.nextInt(1, 100) } // Simulated sorting
view.showNews(sortedNews)
view.hideProgressBar()
}
suspend fun updateProfile(view: View) {
val user = getUserData()
view.showUser(user)
}
// Main function
fun main() = runBlocking {
out.println("Starting the program...")
val view = ConsoleView()
val scope = CoroutineScope(Dispatchers.Default)
scope.launch(CoroutineName("UpdateNews")) {
updateNews(view)
}
scope.launch(CoroutineName("UpdateProfile")) {
updateProfile(view)
}
// Keep the program alive long enough to see the output
delay(2000L)
out.println("Program finished.")
}
Command to reproduce:
gt.sandbox.checkout.commit a22a14e145f6445dd1dc \
&& cd "${GT_SANDBOX_REPO}" \
&& cmd.run.announce "./gradlew run --quiet"
Recorded output of command:
[elapsed: 31ms][tname:main/tid:1][coroutine:unnamed] Starting the program...
[elapsed: 53ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] Loading...
[elapsed: 53ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] Starting news fetch...
[elapsed: 54ms][tname:DefaultDispatcher-worker-2/tid:21][coroutine:UpdateProfile] Starting user data fetch...
[elapsed: 859ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateProfile] User data fetch complete.
[elapsed: 864ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateProfile] User: John Doe
[elapsed: 1057ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] News fetch complete.
[elapsed: 1078ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] News: [News 3, News 2, News 1]
[elapsed: 1078ms][tname:DefaultDispatcher-worker-1/tid:20][coroutine:UpdateNews] Done loading.
[elapsed: 2058ms][tname:main/tid:1][coroutine:unnamed] Program finished.
Backlinks