Room and Flow!

At next week’s Android Summit, I will be leading a workshop, “From RxJava to Coroutines”. The idea is that we would take a small Retrofit-and-Room app and rewrite it to use coroutines rather than RxJava.

When writing the app, though, I realized that Room did not yet support channels or flows. The app relied upon Room’s invalidation tracking to deliver fresh results when the database changed. The only way that I could get a Flow was to have the DAO use Flowable, then use coroutines’ Reactive Streams support to convert the Flowable to a Flow. This worked, but it meant that I had leave RxJava in the app, to get the Flowable.

And so I prayed to Saint Yiğit that Room would get Flow support in time for the Summit.

Yesterday, my prayers were answered! Room 2.2.0-alpha02 advertised Flow support, and in light testing, it works as expected! So now your DAO can have stuff like:

@Query("SELECT * FROM observations ORDER BY timestamp DESC")
abstract fun loadFlow(): Flow<List<ObservationEntity>>

…and you can consume that Flow from within your favorite coroutine builder (e.g., launch()) or a suspend function.

Of course, not only is this Room version an alpha, but Flow itself is still in a release candidate state right now. Experimenting with this stuff is fine, but be careful about shipping production code using this. At least wait until the beta.

But, if you are “coroutines-curious” and are attending the Android Summit, come to my workshop, and I’ll show you how to nuke RxJava from orbit.

UPDATE: Many thanks to Dany Aguacate, who implemented the Flow support in Room!

Want an expert opinion on your Android app architecture decisions? Perhaps Mark Murphy can help!