Как я могу предотвратить перезагрузку данных во второй раз после изменения конфигурации с помощью ViewModel? - PullRequest
0 голосов
/ 15 февраля 2019

Перезагрузка данных после каждого поворота Я выбираю данные в onCreate и наблюдаю в onCreateView ().Я хочу знать, после поворота телефона (или после изменения конфигурации данные снова загружаются, в результате у меня есть эти журналы до поворота

fetchConfig ->observe 

и после поворота у меня есть

observe ->fetchConfig ->observe

КакЯ могу предотвратить повторную загрузку данных? Я добавил в fetchConfig ()

if(customerConfigData.value==null) {} 

, но я не уверен, что это лучшее решение

private val viewModel: HomeViewModel by lazyViewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.fetchConfig()
}

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
viewModel.customerConfigData.observe(viewLifecycleOwner, Observer {
Log.i("test","observe")
})
return inflater.inflate(R.layout.fragment_home,container,false)
}


 fun fetchConfig() {
Log.i("test","fetchConfig")

  uiScope.launch {
    val configEndpoint = EnigmaRiverContext.getExposureBaseUrl().append("v1/customer").append(AppConstants.CUSTOMER_UNIT)
        .append("businessunit").append(AppConstants.BUSINESS_UNIT).append("defaultConfig").append("?preview=true")

    val parsedData = homeRepository.fetchConfig(configEndpoint, GetConfigCall())
    customerConfigMutableData.postValue(parsedData)
}

}

Ответы [ 3 ]

0 голосов
/ 15 февраля 2019

У меня тоже была похожая проблема.Мне предложили попробовать упаковщик событий для LiveData, это решило мою проблему:)

Вот ссылка: Как остановить событие LiveData, вызываемое более одного раза

Надеждаэто помогает!

0 голосов
/ 15 февраля 2019

Как видите, у вашего метода есть параметр с именем savedInstanceState: Bundle?.Этот пакет может сохранить состояние приложения при изменении конфигурации.Таким образом, вы можете поставить здесь любой флаг, который вы хотите.Теперь помните, что ViewModels предназначены для реализации с хорошей базой кода.Итак, вам нужно отделить уровень пользовательского интерфейса от бизнес-уровня.Метод конфигурации извлечения должен быть в другом классе, который не зависит от жизненного цикла Android.Я настоятельно рекомендую прочитать эти статьи.

https://medium.com/androiddevelopers/viewmodels-persistence-onsaveinstancestate-restoring-ui-state-and-loaders-fc7cc4a6c090

https://developer.android.com/jetpack/docs/guide

В заключение.Ваше решение не самое лучшее.Наилучший подход - реализовать правильный слой для извлечения информации таким образом, чтобы она не зависела от жизненного цикла Android.

0 голосов
/ 15 февраля 2019

Я думаю, что одним из решений было бы перевести вызов на fetchConfig() в блок init вашего ViewModel

...