这是 LiveData 的正确使用方式吗?
is this the correct way of LiveData usage?
我目前正在将 Room
+ ViewModel
+ LiveData
应用到我的项目中。
在我的应用程序中,有 "obviously" observe 需要的数据,但不是全部。
下面的代码是 category
数据的示例代码。在我的情况下,类别数据没有改变并且始终保持相同的值状态(13个类别和内容没有改变)。类别是通过 CategoryItemDao
class.
从数据库加载的数据
类目数据需要用livedata包裹吗?
或者除了 observerable
功能之外,还有足够的理由使用 LiveData 吗?
我看过好几遍 LiveData 指南,但我不明白确切的概念。
CategoryItemDao
@Dao
interface CategoryItemDao {
@Query("SELECT * FROM CategoryItem")
fun getAllCategoryItems(): LiveData<MutableList<CategoryItem>>
}
类别存储库
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
}
这很好,但您可以进行一些更改:
将 LiveData<MutableList<CategoryItem>>
更改为 LiveData<List<CategoryItem>>
。除非确实需要,否则不要使用 MutableList
。在您的情况下,List
可以正常工作。
在您的 CategoryRepository
中而不是在 init
中获取,而是在 getAllCategories()
调用期间执行。所以像这样更改您的代码:fun getAllCategories() = categoryItemDao.getAllCategoryItems()
同样在CategoryViewModel
中做同样的事情。将您的代码更改为:fun getAllCategories() = repository.getAllCategories()
一个常见的误解是仅在数据更改时才使用 LiveData
。但事实并非如此。您的 13 个类别可能不会改变,但那是在数据库中。因此,如果您要在没有 LiveData
的情况下完成此操作,则必须查询数据库并在主线程中填充视图,或者您需要将其包装在后台线程中。但是,如果您通过 LiveData
执行此操作,您将免费获得异步反应式编码方式。只要有可能,尽量让你的视图观察到 LiveData
。
我目前正在将 Room
+ ViewModel
+ LiveData
应用到我的项目中。
在我的应用程序中,有 "obviously" observe 需要的数据,但不是全部。
下面的代码是 category
数据的示例代码。在我的情况下,类别数据没有改变并且始终保持相同的值状态(13个类别和内容没有改变)。类别是通过 CategoryItemDao
class.
类目数据需要用livedata包裹吗?
或者除了 observerable
功能之外,还有足够的理由使用 LiveData 吗?
我看过好几遍 LiveData 指南,但我不明白确切的概念。
CategoryItemDao
@Dao
interface CategoryItemDao {
@Query("SELECT * FROM CategoryItem")
fun getAllCategoryItems(): LiveData<MutableList<CategoryItem>>
}
类别存储库
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
}
这很好,但您可以进行一些更改:
将
LiveData<MutableList<CategoryItem>>
更改为LiveData<List<CategoryItem>>
。除非确实需要,否则不要使用MutableList
。在您的情况下,List
可以正常工作。在您的
CategoryRepository
中而不是在init
中获取,而是在getAllCategories()
调用期间执行。所以像这样更改您的代码:fun getAllCategories() = categoryItemDao.getAllCategoryItems()
同样在
CategoryViewModel
中做同样的事情。将您的代码更改为:fun getAllCategories() = repository.getAllCategories()
一个常见的误解是仅在数据更改时才使用 LiveData
。但事实并非如此。您的 13 个类别可能不会改变,但那是在数据库中。因此,如果您要在没有 LiveData
的情况下完成此操作,则必须查询数据库并在主线程中填充视图,或者您需要将其包装在后台线程中。但是,如果您通过 LiveData
执行此操作,您将免费获得异步反应式编码方式。只要有可能,尽量让你的视图观察到 LiveData
。