- Learning Concurrency in Kotlin
- Miguel Angel Castiblanco Torres
- 312字
- 2021-08-05 10:46:50
An asynchronous function with a predefined dispatcher
This brings us to the second option. We can write a function, asyncLoadNews(), that will contain the launch() inside it and return the resulting Job. This function can be called without a launch() block regardless of the thread; and by returning the Job, it's possible for the caller to cancel it:
private fun asyncLoadNews() = launch(dispatcher) {
val headlines = fetchRssHeadlines()
val newsCount = findViewById<TextView>(R.id.newsCount)
launch(UI) {
newsCount.text = "Found ${headlines.size} News"
}
}
This function can be called from anywhere in your code without needing to be wrapped, like this:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
asyncLoadNews()
}
This simplifies the code if the function is called in many places, and it also reduces the flexibility of the function since it will forcefully be executed in a background thread.
It also has the disadvantage that the readability of the code will depend on the correct naming of the function. For example, if you name this implementation loadNews(), the caller of the function may not be aware that this will run asynchronously, and they may not wait for it to complete, which could lead to race conditions or other concurrency issues.
- Visual C++程序設計學習筆記
- Java程序設計實戰教程
- C語言程序設計習題解析與上機指導(第4版)
- Spring技術內幕:深入解析Spring架構與設計
- Learning Bayesian Models with R
- R的極客理想:工具篇
- Learning ELK Stack
- 微信小程序開發解析
- 零基礎學Python數據分析(升級版)
- Python:Master the Art of Design Patterns
- Android應用案例開發大全(第二版)
- 區塊鏈技術與應用
- Visualforce Developer’s guide
- Scala Data Analysis Cookbook
- Android驅動開發權威指南