首页 > 解决方案 > MVVM LiveData 第一次在 bottomSheetFragment 中变慢

问题描述

我不明白为什么我的带有 LiveData 的 MVVM 需要很长时间才能在 BottomSheetFragment 中做出响应,但只是在我第一次打开片段时。

这是我的代码:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        Log.d("HERE", "onViewCreated")
        abilityViewModel = ViewModelProvider(this)[AbilityViewModel::class.java]
        setupViewModel()
        Log.d("HERE", "viewModelCreated")
        abilityViewModel.getAbilityByName(abilityName)

private fun setupViewModel() {
        abilityViewModel.abilityName.observe(viewLifecycleOwner, Observer { ability ->
            Log.d("HERE", ability.name)
            fillInfo(ability)
        })
    }

这是视图模型:

class AbilityViewModel(application: Application) : AndroidViewModel(application) {

    private val repository: AbilityRepository
    private val _abilityName: MutableLiveData<String> = MutableLiveData()

    val abilityName: LiveData<Ability>

    fun getAbilityByName(name: String) {
        _abilityName.value = name
    }

    init {
        val abilityDao: AbilityDao = MainDatabase(application, viewModelScope).abilityDao()
        repository = AbilityRepository(abilityDao)
        abilityName = Transformations.switchMap(_abilityName){abilityName ->
            repository.getAbilityByName(abilityName)
        }
    }
}

这是我第一次打开片段的日志: 第一次

在第一次之后,同一个fragment和同类型的不同fragment在加载时都是零延迟: 第二次

第三次

帮助将不胜感激,谢谢

编辑

为了在@commonsware 建议的地方获得时间,我这样做了:

class AbilityViewModel(application: Application) : AndroidViewModel(application) {

    private val repository: AbilityRepository
    private val _abilityName: MutableLiveData<String> = MutableLiveData()

    val abilityName: LiveData<Ability>

    fun getAbilityByName(name: String) {
        Log.d("HERE", "getAbilityByName called")
        _abilityName.value = name
        Log.d("HERE", "getAbilityByName value assigned")
    }

    init {
        val abilityDao: AbilityDao = MainDatabase(application, viewModelScope).abilityDao()
        repository = AbilityRepository(abilityDao)
        abilityName = Transformations.switchMap(_abilityName){abilityName ->
            Log.d("HERE", "switchMap called")
            repository.getAbilityByName(abilityName)
        }
    }
}

但是,正如您在此处看到的那样,问题似乎不在这两种方法中的任何一种中:

第四张图片

此外,数据库在应用程序启动时初始化,即在此之前

编辑 2

这是为容纳日志而修改的存储库:

class AbilityRepository(private val abilityDao: AbilityDao) {
    //fun getAbilityByName(name: String) = abilityDao.getAbilityByName(name)
    fun getAbilityByName(name: String): LiveData<Ability> {
        Log.d("HERE", "getAbilityByName called from repo")
        return abilityDao.getAbilityByName(name)
    }
}

然而,这里的时间似乎也很好 第五张图片

标签: androidandroid-fragmentskotlinmvvmandroid-livedata

解决方案


推荐阅读