ebook img

Kotlin Coroutines by Tutorials PDF

287 Pages·2022·29.267 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Kotlin Coroutines by Tutorials

Kotlin Coroutines by Tutorials Kotlin Coroutines by Tutorials Kotlin Coroutines by Tutorials By Filip Babić, Luka Kordić and Nishant Srivastava Copyright ©2022 Razeware LLC. Notice of Rights All rights reserved. No part of this book or corresponding materials (such as text, images, or source code) may be reproduced or distributed by any means without prior written permission of the copyright owner. Notice of Liability This book and all corresponding materials (such as source code) are provided on an “as is” basis, without warranty of any kind, express of implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in action of contract, tort or otherwise, arising from, out of or in connection with the software or the use of other dealing in the software. Trademarks All trademarks and registered trademarks appearing in this book are the property of their own respective owners. raywenderlich.com 2 Kotlin Coroutines by Tutorials Table of Contents: Overview Book License............................................................................................. 11 Before You Begin................................................................ 12 What You Need........................................................................................ 13 Book Source Code & Forums............................................................. 14 Acknowledgments.................................................................................. 18 Introduction.............................................................................................. 19 Section I: Introduction to Coroutines.......................... 21 Chapter 1: What Is Asynchronous Programming?........ 22 Chapter 2: Setting Up Your Build Environments........... 40 Chapter 3: Getting Started With Coroutines.................. 52 Chapter 4: Suspending Functions........................................ 66 Chapter 5: Async/Await........................................................... 89 Chapter 6: Coroutine Context............................................ 112 Chapter 7: Context Switch & Dispatching..................... 119 Chapter 8: Exception Handling.......................................... 130 Chapter 9: Manage Cancellation....................................... 144 Section II: Channels & Flows........................................ 156 Chapter 10: Building Sequences & Iterators With Yield............................................................................................... 157 Chapter 11: Beginning With Coroutine Flow............... 171 Chapter 12: SharedFlow & StateFlow............................. 185 raywenderlich.com 3 Kotlin Coroutines by Tutorials Chapter 13: Testing Coroutines......................................... 199 Section III: Coroutines & Android .............................. 210 Chapter 14: Coroutines & Android................................... 211 Chapter 15: Coroutines in the UI Layer.......................... 234 Chapter 16: Networking With Coroutines.................... 244 Chapter 17: Persistence & Coroutines........................... 254 Chapter 18: Coroutines & Jetpack................................... 267 Conclusion.............................................................................................. 287 raywenderlich.com 4 Kotlin Coroutines by Tutorials Table of Contents: Extended Book License. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Before You Begin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 What You Need . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Book Source Code & Forums . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Content Development. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 About Kotlin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 About Coroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 How to read this book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 Section I: Introduction to Coroutines . . . . . . . . . . . . . . 21 Chapter 1: What Is Asynchronous Programming?. . . . . . . . . . . 22 Providing Feedback. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Why Multithreading? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Interacting With the UI Thread From the Background. . . . . . . . . . . . . . . 26 Handling Work Completion Using Callbacks. . . . . . . . . . . . . . . . . . . . . . . . . 29 Indentation Hell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Using Reactive Programming for Background Work. . . . . . . . . . . . . . . . . 32 Diving Deeper Into the Complexity of Rx. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 A Blast From the Past. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 Explaining Coroutines: The Inner Work . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 Variations Through History. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Chapter 2: Setting Up Your Build Environments. . . . . . . . . . . . . 40 Choosing the Build Environments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 raywenderlich.com 5 Kotlin Coroutines by Tutorials Installing the IntelliJ IDEA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Installing the Android Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Importing a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Chapter 3: Getting Started With Coroutines. . . . . . . . . . . . . . . . 52 Executing Routines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Launching a Coroutine. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Building Coroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Explaining Jobs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Canceling Jobs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Digging Deeper Into Coroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Posting to the UI Thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Chapter 4: Suspending Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Suspending vs. Non-Suspending. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 Elaborating Continuations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Creating Your Own Suspendable API. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Returning Values Using withContext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Chapter 5: Async/Await. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 The Async/Await Pattern. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Learning From the Past . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Using Async/Await. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Deferring Values. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Combining Multiple Deferred Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Being Cooperative and Structured. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 raywenderlich.com 6 Kotlin Coroutines by Tutorials Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Chapter 6: Coroutine Context. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Contextualizing Coroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Providing Contexts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Chapter 7: Context Switch & Dispatching. . . . . . . . . . . . . . . . . . 119 Work Scheduling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Coroutine Dispatcher Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Using Dispatchers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Chapter 8: Exception Handling. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Exception Propagation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 CoroutineExceptionHandler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Try-Catch to the Rescue. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Handling Multiple Child Coroutine Exceptions . . . . . . . . . . . . . . . . . . . . . 136 Callback Wrapping. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Supervising Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Chapter 9: Manage Cancellation. . . . . . . . . . . . . . . . . . . . . . . . . . . 144 Cancelling a Coroutine. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 Timing Out . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Section II: Channels & Flows. . . . . . . . . . . . . . . . . . . . . . 156 Chapter 10: Building Sequences & Iterators With Yield . . . 157 Getting Started With Sequences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Enter: Sequence. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Generators & Sequences. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 raywenderlich.com 7 Kotlin Coroutines by Tutorials Yielding From SequenceScope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Providing Values With Yield & YieldAll. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Chapter 11: Beginning With Coroutine Flow . . . . . . . . . . . . . . 171 Streams of Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172 Limitations of Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 A New Approach to Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Flow Constraints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Chapter 12: SharedFlow & StateFlow. . . . . . . . . . . . . . . . . . . . . . 185 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Sharing a Flow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186 Building a StateFlow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 Chapter 13: Testing Coroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Writing Tests for Coroutines. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Setting Up the Test Environment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Summing it up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Section III: Coroutines & Android. . . . . . . . . . . . . . . . . 210 Chapter 14: Coroutines & Android. . . . . . . . . . . . . . . . . . . . . . . . . 211 The Importance of the Android Main Thread . . . . . . . . . . . . . . . . . . . . . . . 211 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212 Doing Heavy Work on UI Thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214 Thread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216 raywenderlich.com 8 Kotlin Coroutines by Tutorials Handler. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 HandlerThread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Executors. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 RxJava. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226 Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233 Chapter 15: Coroutines in the UI Layer . . . . . . . . . . . . . . . . . . . . 234 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Introducing Lifecycle Scope. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Collecting Flows in the UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Chapter 16: Networking With Coroutines. . . . . . . . . . . . . . . . . 244 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Network Call With Callbacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Coroutine-Powered Networking. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247 Retrofit Meets Coroutines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Chapter 17: Persistence & Coroutines. . . . . . . . . . . . . . . . . . . . . 254 Getting Started. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Suspending Database Calls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Observing Database Changes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261 Suspending Transactions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Chapter 18: Coroutines & Jetpack . . . . . . . . . . . . . . . . . . . . . . . . . 267 Coroutines in ViewModels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268 Comparing LiveData to Kotlin Flow. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 raywenderlich.com 9 Kotlin Coroutines by Tutorials Coroutines & Flow in Jetpack Compose . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Testing Coroutines on Android. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Key Points. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Where to Go From Here?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Conclusion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 raywenderlich.com 10

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.