我目前正在将Room + ViewModel + LiveData应用于我的项目。在我的应用程序中,有“明显”的观察数据是必要的,但不是全部。
下面的代码是category数据的示例代码。在我的情况下,类别数据不会更改,并且始终保持相同的值状态(13个类别和内容不会更改)。类别是通过CategoryItemDao类从数据库加载的数据。
类别数据需要用livedata包装吗?或者,除了使用LiveData的observerable特性之外,是否有足够的理由使用它?
我已经读过几次LiveData指南,但我不明白确切的概念。
CategoryItemDao
@Dao
interface CategoryItemDao {
@Query("SELECT * FROM CategoryItem")
fun getAllCategoryItems(): LiveData<MutableList<CategoryItem>>
}CategoryRepository
class CategoryRepository(application: Application) {
private val categoryItemDao: CategoryItemDao
private val allCategories: LiveData<MutableList<CategoryItem>>
init {
val db = AppDatabase.getDatabase(application)
categoryItemDao = db.categoryItemDao()
allCategories = categoryItemDao.getAllCategoryItems()
}
fun getAllCategories() = allCategories
}CategoryViewModel
class CategoryViewModel(application: Application) : AndroidViewModel(application) {
private val repository = CategoryRepository(application)
private val allCategories: LiveData<MutableList<CategoryItem>>
init {
allCategories = repository.getAllCategories()
}
fun getAllCategories() = allCategories
}发布于 2018-08-23 01:36:03
这很好,但是您可以做一些更改:
LiveData<MutableList<CategoryItem>>更改为LiveData<List<CategoryItem>>。除非你必须使用MutableList,否则不要使用它。在您的例子中,List会工作得很好。CategoryRepository中而不是在init中获取,在getAllCategories()调用期间执行它。因此,修改代码如下:fun getAllCategories() = categoryItemDao.getAllCategoryItems()CategoryViewModel中也要这样做。将代码更改为:fun getAllCategories() = repository.getAllCategories()一个常见的误解是,只有在数据发生变化时才使用LiveData。但那不是真的。您的13个类别可能不会更改,但这在数据库中。因此,如果要在不使用LiveData的情况下完成这一任务,则必须查询DB并在主线程中填充视图,或者需要将其封装在后台线程中。但是,如果您通过LiveData实现这一点,您将获得异步反应式的免费编码方式。只要有可能,尽量让您的视图观察到一个LiveData。
https://stackoverflow.com/questions/51947757
复制相似问题