代码之家  ›  专栏  ›  技术社区  ›  Mike

启动后台任务时附加观察者的正确顺序

  •  0
  • Mike  · 技术社区  · 5 年前

    在片段或活动中,设置观察者与启动数据生产者之间是否有推荐的顺序?

    例如,假设没有其他人正在获取数据或进行观察,那么:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
     ): View? {
    
        // OPTION A: this seems bullet-proof. Setup the observer first, 
        //  then trigger the generation of the data...
        // ----------------------------------------------------------
        // 1) setup observer
        mainViewModel.myResponse.observe(viewLifecycleOwner, { response -> {...} })
    
        // 2) initiate data fetching
        mainViewModel.generateFetchInBackground()
    
        // OPTION B: this is what I sometimes see done. This seems like
        //   a race condition since the triggering of generation happens
        //   first, then the observer is established...
        // ----------------------------------------------------------
        // 1) initiate data fetching
        mainViewModel.generateFetchInBackground()        
        
        // 2) setup observer
        mainViewModel.myResponse.observe(viewLifecycleOwner, { response -> {...} })
    
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Sergei Bubenshchikov    5 年前

    当你开始提供数据或观察数据时,这并不重要。 LiveData 保证所有值将在您的观察员收到时交付给他们 become active .

    当您更新存储在LiveData对象中的值时,只要连接的LifecycleOwner处于活动状态,它就会触发所有已注册的观察者。 LiveData允许UI控制器观察者订阅更新。当LiveData对象所持有的数据发生变化时,UI会自动更新作为响应。

    这就是为什么 实时数据 帮助您分离生产者和观察者。而且没有比赛条件 实时数据 因为它在主线程上传递所有数据。