LifecycleOwner в настоящее время необходим мне для создания наблюдателя.
У меня есть код, который создает наблюдателя в ViewModel, поэтому я присоединяю LifecycleOwner при получении ViewModel в моем фрагменте.
Согласно документации Google.
Внимание: ViewModel никогда не должна ссылаться на представление, жизненный цикл или любой класс, который может содержать ссылку на контекст активности.
Нарушил ли я это предупреждение, и если да, то каким образом вы порекомендуете мне переместить мое создание наблюдатель для возврата данных?
Я создал только наблюдателя, поэтому мне интересно, действует ли он еще. Так как в документации Google также сказано.
Объекты ViewModel могут содержать LifecycleObservers, например объекты LiveData.
MainFragment
private lateinit var model: MainViewModel
/**
* Observer for our ViewModel IpAddress LiveData value.
* @see Observer.onChanged
* */
private val ipObserver = Observer {
textIp.text = it
hideProgressBar()
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
model = ViewModelProviders.of(this).get(MainViewModel::class.java)
model.attach(this)
}
override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater?.inflate(R.layout.fragment_main, container, false)
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
buttonRetrieveIp.setOnClickListener {
showProgressBar()
model.fetchMyIp().observe(this, ipObserver) //Here we attach our ipObserver
}
}
override fun showProgressBar() {
textIp.visibility = View.GONE
progressBar.visibility = View.VISIBLE
}
override fun hideProgressBar() {
progressBar.visibility = View.GONE
textIp.visibility = View.VISIBLE
}
MainViewModel
private var ipAddress = MutableLiveData()
private lateinit var owner: LifecycleOwner
fun attach(fragment: MainFragment) {
owner = fragment
}
/**
* For more information regarding Fuel Request using Fuel Routing and Live Data Response.
* @see Fuel Routing Support
* @see Fuel LiveData Support
* */
fun fetchMyIp(): LiveData {
Fuel.request(IpAddressApi.MyIp())
.liveDataResponse()
.observe(owner, Observer {
if (it?.first?.statusCode == 200) {//If you want you can add a status code checker here.
it.second.success {
ipAddress.value = Ip.toIp(String(it))?.ip
}
}
})
return ipAddress
}
Обновление 1: улучшенная модель представления благодаря предложению @pskink по использованию преобразований.
private lateinit var ipAddress:LiveData
/**
* Improved ViewModel since January 23, 2018 credits to pskink [url=
*
* For more information regarding Fuel Request using Fuel Routing and Live Data Response.
* @see
Подробнее здесь: https://stackoverflow.com/questions/483 ... -viewmodel
Должен ли я включить LifecycleOwner в ViewModel? ⇐ Android
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение