Я не понимаю, почему мой MVVM с LiveData занимает много времени, чтобы ответить в 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)
})
}
Вот ViewModel:
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)
}
}
}
Это журнал, когда я впервые открываю фрагмент:
После первого раза и один и тот же фрагмент и разные фрагменты одного и того же типа принимают нулевую задержку при загрузке:
Справка будет с благодарностью, спасибо
РЕДАКТИРОВАТЬ
Чтобы получить время в местах, предложенных @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
Здесь хранилище, измененное для размещения t Журнал:
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)
}
}
Однако и здесь время кажется хорошим.