【问题标题】:When to call livedata observer?何时调用 livedata 观察者?
【发布时间】:2020-12-29 06:53:38
【问题描述】:

单击按钮时,我必须从 API 调用中获取一些值,然后启动一个屏幕。我有两个选择:

  1. 每次用户点击按钮时调用观察者。
  2. 在片段 onActivityCreated() 上调用观察者并将值存储在变量中,并在按钮单击时采取相应措施。

那么我应该采用哪种方法呢?

【问题讨论】:

  • 我更喜欢在 onClick 事件中这样做,但要注意多次点击。您可以简单地显示一个加载对话框并禁用按钮,直到收到响应。
  • 有什么理由在 onClick() 中这样做吗?

标签: android android-livedata


【解决方案1】:

其实这取决于你。但我总是更喜欢在 Activity 的 onCreate() 函数中调用它,所以 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上,数据显示在Fragment中,需要在ActivityViewModel中存储变量,在Fragment中观察

    你只需要在fragment创建的时候调用一次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 ->
                ...
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多