Chapter 10. Flows

Up to now, we’ve covered coroutines, suspending functions, and how to deal with streams using Channels. We’ve seen from the previous chapter that working with Channels implies starting coroutines to send and/or receive from those Channels. The aforementioned coroutines are then hot entities that are sometimes hard to debug, or can leak resources if they aren’t cancelled when they should be.

Flows, like Channels, are meant to handle asynchronous streams of data, but at a higher level of abstraction and with better library tooling. Conceptually, Flows are similar to Sequences, except that each step of a Flow can be asynchronous. It is also easy to integrate flows in structured concurrency, to avoid leaking resources.

However, Flows1 aren’t meant to replace Channels. Channels are building blocks for flows. Channels are still appropriate in some architectures such as in CSP (see Chapter 9). Nevertheless, you’ll see that flows suit most needs in asynchronous data processing.

In this chapter, we’ll introduce you to cold and hot flows. You’ll see how cold flows can be a better choice when you want to make sure never to leak any resources. On the other hand, hot flows serve a different purpose such as when you need a “publish-subscribe” relationship between entities in your app. For example, you can implement an event bus using hot flows.

The best way to understand flows is to see how they are used in real-life applications. So this chapter will also go through a series ...

Get Programming Android with Kotlin now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.