#android #android-livedata
#Android #android-livedata
Вопрос:
При нажатии кнопки я должен получить некоторое значение из вызова API, а затем запустить один экран. У меня есть два варианта:
- Вызывайте наблюдателя каждый раз, когда пользователь нажимает на кнопку.
- Вызовите наблюдателя для фрагмента onActivityCreated() и сохраните значение в переменной и действуйте соответствующим образом при нажатии кнопки.
Итак, какому подходу я должен следовать?
Комментарии:
1. Я предпочитаю делать это в событии onClick, но имейте в виду несколько кликов. вы можете просто показать диалоговое окно загрузки и отключить кнопку до получения ответа.
2. есть ли какая-либо причина для этого в onClick() ?
Ответ №1:
На самом деле это зависит от вас. Но я всегда предпочитаю вызывать его в функции onCreate() Activity, поэтому у activity есть только 1 наблюдатель. Если вы вызовете его при нажатии кнопки, это даст вам несколько наблюдателей столько же, сколько при нажатии кнопки
Вот несколько примеров :
class HomeProfileActivity: BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initObserver()
initView()
}
private fun initObserver() {
viewModel.profileWorkProccess.observe(this, {
swipeRefreshLayout.isRefreshing = it
})
viewModel.isLoadingJobs.observe(this, {
layoutProgressBarJobs.visibility = View.VISIBLE
recyclerViewJobs.visibility = View.GONE
dotsJobs.visibility = View.GONE
})
//other viewmodel observing ......
}
private fun initView() {
imageProfile.loadUrl(user.image, R.drawable.ic_user)
textName.text = identity.user?.fullName
textAddress.text = identity.user?.city
buttonGetData.setOnClickListener { viewModel.getData(this) }
}
}
Ответ №2:
Если кнопка размещена на Activity, а данные отображаются во фрагменте, вам необходимо сохранить переменную в Activity ViewModel и наблюдать за ней во фрагменте
Вам нужно вызвать observe только один раз при создании фрагмента.
Например:
class MyActivity : AppCompatActivity() {
val viewModel: MyActViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
myButton.setOnClickListener { view ->
viewModel.getData()
}
}
}
class MyActViewModel: ViewModel {
val data: LiveData<String> = MutableLiveData()
fun getData() {}
}
class MyFragment: Fragment {
val actViewModel: MyActViewModel by activityViewModels()
override fun onActivityCreated(...) {
....
actViewModel.data.observe(viewLifecycleOwner, Observer { data ->
...
}
}
}