The importance of concurrency is discovered quite early on by people who start with Android development. Android is inherently asynchronous and event-driven, with strict requirements as to on which thread certain things can happen.
Add to this the often-cumbersome Java callback interfaces, and you will be trapped in spaghetti code pretty quickly (aptly termed as “Callback Hell”). No matter how many coding patterns you use to avoid that, you will have to encounter the state change across multiple threads in one way or the other.
The only way to create a responsive app is by leaving the UI thread as free as possible, letting all the hard work be done asynchronously by background threads.
Kotlin Coroutines by Tutorials will teach you the techniques you need to solve common programming problems using asynchronous programming.
Before You Begin
This section tells you a few things you need to know before you get started, such as what you’ll need for hardware and software, where to find the project files for this book, and more.
In the first chapter, you’ll learn about the problems related to multithreading and how coroutines can be an elegant solution. After setting up your development environment in IntelliJ or Android Studio, you’ll start writing your first coroutine to understand what suspending functions are and how to define them. You’ll finish this section learning how to use async and await functions for efficient use of resources.
In this very first chapter, you’ll learn what asynchronous programming means and why a modern developer should understand it. You’ll see the basics of multithreading like queue and shared memory, and you’ll understand how to solve the "Indentation Hell Problem."
Learning through example is one of the most efficient ways to gain more skills. To do this, you need to set up your build environment and learn how to load the starting projects with IntelliJ or Android Studio. This chapter describes all you need to start writing your code.
This is the chapter where you’ll learn the main concepts about coroutines like builders, scope and context. You’ll see for the first time the Job object and learn how to manage dependencies between coroutines. You’ll understand and write code to manage one of the most important features of asynchronous tasks: cancellations.
To understand how to use coroutines, you need to learn what a suspending function is and how to implement it. In this chapter, you’ll learn all you need to create and use your suspending functions. You’ll also learn how to change your existing functions to use them in a coroutine.
In multithreading and asynchronous development in Java, you often use Runnable, Callable and Future. With coroutines, you can use Deferred instead. These are objects that you can manage using the async/await functions. In this chapter, you’ll write code to understand when and how to use this pattern most effectively.
This chapter is about one of the most important concepts about coroutines: Coroutine Context. You'll learn what it is and how this is related to the dependencies between different coroutine jobs. You'll also learn how to create your context.
In this chapter, you'll learn how to run different Jobs into the proper thread. You'll learn how to configure and use the proper thread to display information on the UI or to invoke different services on the network.
Using functions with a callback is not difficult only because of the indentation hell problem but also for error and exception handling. In this very important chapter, you’ll learn, with several examples, all the techniques you can use to handle exceptions.
One of the most important topics to master when you deal with multithreading is a cancellation. Starting a thread is very easy compared to the techniques used to cancel it leaving the system in a consistent state. In this very important chapter, you’ll learn, with several examples, all the techniques you can use to manage cancellations.
Section II: Channels & Flows
Coroutines provide you a set of suspending functions and coroutine builders for the most common use cases. In order to use them, you need to know some more details on how they work under the hood. In this section, you’ll explore channels, Coroutine Flow and testing your coroutines.
Sequences are one of the most interesting features of Kotlin because they allow generating values lazily. When you implement a sequence you use the yield function which is a suspending function. In this chapter, you’ll learn how to create sequences and how the yield function can be used to optimize performance.
Although experimental, channels are a very important API you can use with coroutines. In this chapter, you’ll create examples to understand what a channel is and how to act as a producer or consumer for it synchronously and asynchronously. You’ll understand how to use multiple channels in the case of multiple senders and receivers. You’ll finally compare channels with Java’s BlockingQueue.
In this chapter, you’ll learn how coroutines can help implement a producer/consumer pattern using different types of producers and consumers. Another approach to running tasks in the background is to use the actors model. In the second part of this chapter, you’ll learn what an Actor is and how you can use it with coroutines.
Testing is a fundamental part of the development process and coroutines are not different. In this chapter, you'll learn how to test coroutines using the main testing frameworks.
Section III: Coroutines & Android
Coroutines are becoming a very important tool for any Kotlin application and in particular for Android applications. They allow the creation of applications that are more readable and use simpler code. In this section, you’ll learn how to use coroutines as a valid option for running background tasks which interact with the UI thread.
The Android platform allows you to run background tasks in many different ways. In this chapter, you’ll see and implement examples for all of them. You’ll learn what Looper and Handler are and when to use an AsyncTask. You’ll finally see how coroutines can make the code more readable and efficient.
This chapter covers using Kotlin Coroutines in an Android app, covering working with various context;
i.e. UI and background to simplify and manage code sequentially. It will cover converting async callbacks for long-running tasks, such as a database or network access into sequential tasks while also keeping track and handling of the app lifecycle.
This chapter covers fortifying the use of Kotlin Coroutines in an Android app; i.e. enabling logging, exception handling, debugging and testing of code that uses Kotlin Coroutines. You will also discover the Anko library.
Android is inherently asynchronous and event-driven, with strict requirements as to on which thread certain things can happen.
Learn how to use Kotlin coroutines to solve common Android programming problems using asynchronous programming techniques!