android viewmodels之间的inter通信

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述android viewmodels之间的inter通信相关的知识,希望能为你提供帮助。
我有一个客户详细信息页面,它从“客户”表中加载客户详细信息,并允许对某些详细信息进行编辑,其中一个是客户的位置。客户的位置是一个微调器,从“位置”表加载下拉项。
所以我当前的实现是我有一个CustomerActivity,它有一个CustomerViewModel和LocationViewModel

public class CustomerActivity extends AppCompatActivity { ... onCreate(@Nullable Bundle savedInstanceState) { ... customerViewModel.getCustomer(customerId).observe(this, new Observer< Customer> () { @Override public void onChanged(@Nullable Customer customer) { // bind to view via databinding } }); locationViewModel.getLocations().observe(this, new Observer< Location> () { @Override public void onChanged(@Nullable List< Location> locations) { locationSpinnerAdapter.setLocations(locations); } }); } }

我的问题是如何使用“customer”表中的值设置位置微调器,因为两个viewmodel执行顺序的onChanged可能不同(有时客户加载速度更快,而其他位置加载速度更快)。
我只考虑在客户加载后才加载位置,但是无论如何我可以同时加载两个位置,同时使用“customer”表中的值填充客户的位置微调器?
答案是的,您可以使用标志。
public class CustomerActivity extends AppCompatActivity { private Customer customer = null; private List< Location> locations = null; ... onCreate(@Nullable Bundle savedInstanceState) { ... customerViewModel.getCustomer(customerId).observe(this, new Observer< Customer> () { @Override public void onChanged(@Nullable Customer customer) { // bind to view via databinding this.customer = customer; if(locations != null){ both are loaded } } }); locationViewModel.getLocations().observe(this, new Observer< Location> () { @Override public void onChanged(@Nullable List< Location> locations) { locationSpinnerAdapter.setLocations(locations); this.locations = locations; if(customer != null){ //customer and locations loaded } } }); } }

另一答案【android viewmodels之间的inter通信】听起来你想要类似于Rxjava的combineLatest operator。
您可以使用MediatorLiveData实现自己的版本。

    推荐阅读