MVVM LiveData медленно в первый раз в bottomSheetFragment - PullRequest
0 голосов
/ 19 марта 2020

Я не понимаю, почему мой 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)
        }
    }
}

Это журнал, когда я впервые открываю фрагмент: first_time

После первого раза и один и тот же фрагмент и разные фрагменты одного и того же типа принимают нулевую задержку при загрузке: second_time

third_time

Справка будет с благодарностью, спасибо

РЕДАКТИРОВАТЬ

Чтобы получить время в местах, предложенных @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)
        }
    }
}

Однако, похоже, проблема не в каком-либо из этих двух методов, как вы можете видеть здесь:

fourth_pic

Кроме того, база данных инициализируется, когда приложение начинается, что до этой точки

РЕДАКТИРОВАТЬ 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)
    }
}

Однако и здесь время кажется хорошим. fifth_pic

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...