Когда вызывать livedata observer?

#android #android-livedata

#Android #android-livedata

Вопрос:

При нажатии кнопки я должен получить некоторое значение из вызова API, а затем запустить один экран. У меня есть два варианта:

  1. Вызывайте наблюдателя каждый раз, когда пользователь нажимает на кнопку.
  2. Вызовите наблюдателя для фрагмента 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 ->
            ...
        }
    }
}