我需要将一个LiveData
对象返回的一种类型的数据在后台线程上转换为另一种形式,以防止UI卡顿。
在我的具体情况下,我有:
MyDBRow
对象(由原始的long
和String
构成的POJO);- 一个Room DAO实例通过
LiveData<List<MyDBRow>>
发出这些对象; - 一个期望更丰富的
MyRichObject
对象的UI(将原始数据膨胀到例如日期/时间对象中的POJO)
因此,我需要将LiveData<List<MyDBRow>>
转换为LiveData<List<MyRichObject>>
,但不能在UI线程上执行此操作。
Transformations.map(LiveData<X>, Function<X, Y>)
方法可以进行所需的转换,但我不能使用它,因为它在主线程上执行转换:
将给定函数应用于由
source
LiveData发出的每个值,并返回LiveData,该LiveData发出结果值。给定函数
func
将在主线程上执行。
如何清晰地使LiveData
转换发生:
- 在主线程之外的某个地方,以及
- 仅在需要时(即只有当某些东西观察到预期的转换时)?
observeOn
和subscribeOn
这样的东西,它们允许你在一行代码中决定你的计算将在哪个线程(或线程池!)上运行。非常棒,这将使我上面的大部分代码变得无意义。 - Alex Peters