这是 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
}

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

  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