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
Flowable to a
Flow. This worked, but it meant that I had leave RxJava
in the app, to get the
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
support, and in light testing, it works as expected! So now your DAO can have
@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
launch()) or a
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.
Want an expert opinion on your Android app architecture decisions? Perhaps Mark Murphy can help!