代码之家  ›  专栏  ›  技术社区  ›  pistolcaffe

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

  •  1
  • pistolcaffe  · 技术社区  · 7 年前

    我目前正在申请 Room + ViewModel + LiveData 我的计划。 在我的应用程序中,有“明显”的观察数据是需要的,但不是全部。

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

    类别数据需要用LiveData包装吗? 或者是否有足够的理由使用LiveData observerable 特色?

    我已经读了几遍LiveData指南,但我不理解确切的概念。

    分类方法

    @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
    }
    

    类别视图模型

    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 回复  |  直到 7 年前
        1
  •  1
  •   Henry    7 年前

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

    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个类别可能不会更改,但这在数据库中。所以如果你想在没有 利瓦达 您必须查询数据库并在主线程中填充视图,或者您需要将其包装在一个后台线程中。但是如果你通过 利瓦达 您可以免费获得异步无功编码方式。尽可能让你的视野 利瓦达 .