android - 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)
}
}
解决方案
推荐阅读
- javascript - 如何重复数组中的第一个元素,每个 2 索引
- .net - vb.net 无法对文件名进行排序
- apache - 加载 Moodle 站点时打开默认 Apache 页面的原因是什么
- java - 如何在给定的时间段内减去给定的秒数。小时单位可以是负数
- slack - 有没有办法阻止我的 Slack 应用程序在频道中使用?
- c# - 跳过了 675 帧!应用程序可能在其主线程上做了太多工作。如何在不冻结 UI 的情况下使应用程序在后台运行?
- r - R按大数据完全倒置的列分组
- javascript - 使用 Javascript 将我自己的 PDF 文档加载到 Syncfusion PDF 查看器中
- r - 收到错误:c [4:16] 中的错误:“内置”类型的对象不是子集
- python - 对 python 中的 size() 函数感到困惑