首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是正确使用LiveData的方式吗?

这是正确使用LiveData的方式吗?
EN

Stack Overflow用户
提问于 2018-08-21 11:30:38
回答 1查看 1.2K关注 0票数 1

我目前正在将Room + ViewModel + LiveData应用于我的项目。在我的应用程序中,有“明显”的观察数据是必要的,但不是全部。

下面的代码是category数据的示例代码。在我的情况下,类别数据不会更改,并且始终保持相同的值状态(13个类别和内容不会更改)。类别是通过CategoryItemDao类从数据库加载的数据。

类别数据需要用livedata包装吗?或者,除了使用LiveData的observerable特性之外,是否有足够的理由使用它?

我已经读过几次LiveData指南,但我不明白确切的概念。

CategoryItemDao

代码语言:javascript
复制
@Dao
interface CategoryItemDao {
    @Query("SELECT * FROM CategoryItem")
    fun getAllCategoryItems(): LiveData<MutableList<CategoryItem>>
}

CategoryRepository

代码语言:javascript
复制
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

代码语言:javascript
复制
class CategoryViewModel(application: Application) : AndroidViewModel(application) {
    private val repository = CategoryRepository(application)
    private val allCategories: LiveData<MutableList<CategoryItem>>

    init {
        allCategories = repository.getAllCategories()
    }

    fun getAllCategories() = allCategories
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-23 01:36:03

这很好,但是您可以做一些更改:

  1. LiveData<MutableList<CategoryItem>>更改为LiveData<List<CategoryItem>>。除非你必须使用MutableList,否则不要使用它。在您的例子中,List会工作得很好。
  2. 在您的CategoryRepository中而不是在init中获取,在getAllCategories()调用期间执行它。因此,修改代码如下:fun getAllCategories() = categoryItemDao.getAllCategoryItems()
  3. 同样,在CategoryViewModel中也要这样做。将代码更改为:fun getAllCategories() = repository.getAllCategories()

一个常见的误解是,只有在数据发生变化时才使用LiveData。但那不是真的。您的13个类别可能不会更改,但这在数据库中。因此,如果要在不使用LiveData的情况下完成这一任务,则必须查询DB并在主线程中填充视图,或者需要将其封装在后台线程中。但是,如果您通过LiveData实现这一点,您将获得异步反应式的免费编码方式。只要有可能,尽量让您的视图观察到一个LiveData

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51947757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档