这是LiveData使用的正确方法吗?

时间:2018-08-21 11:30:38

标签: android kotlin android-room android-livedata android-viewmodel

我目前正在为我的项目应用Room + ViewModel + LiveData。 在我的应用程序中,“显然”观察到需要的数据,但不是全部。

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

类别数据是否需要与livedata包装在一起? 还是有足够的理由使用LiveData的observerable功能?

我已经多次阅读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
}

1 个答案:

答案 0 :(得分:1)

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

  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的情况下完成此操作,则必须查询数据库并在主线程中填充视图,或者需要将其包装在后台线程中。但是,如果您通过LiveData执行此操作,则会免费获得异步响应式编码方式。只要有可能,请尝试使您的视图观察LiveData