android viewmodels之间的inter通信

时间:2017-12-21 03:30:40

标签: android mvvm android-architecture

我有一个客户详细信息页面,它从“客户”表中加载客户详细信息,并允许对某些详细信息进行编辑,其中一个是客户的位置。客户的位置是一个微调器,下拉项从“位置”表加载。

所以我当前的实现是我有一个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”表中的值填充客户的位置微调器?

2 个答案:

答案 0 :(得分:0)

是的,您可以使用标记。

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
              }
        }
      });
   }
}

答案 1 :(得分:0)

听起来你想要类似于RxJava的combineLatest operator

您可以使用MediatorLiveData实现自己的版本。