【问题标题】:Is it possible for MediatorLiveData to wait for two livedata too receive an update?MediatorLiveData 是否有可能等待两个 livedata 也收到更新?
【发布时间】:2020-03-11 18:01:13
【问题描述】:

正如标题所说。我有两个从 API 获取一些数据的 livedata 对象。我想等待两个 livedata 完成获取数据,然后再对它们的值进行一些操作。 这是我目前所拥有的:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private Button myButt;
    private MainViewModel mvw;
    private TextView myView;
    private MediatorLiveData data;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        mvw = new ViewModelProvider(this).get(MainViewModel.class);

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        myButt = findViewById(R.id.button);
        myView = findViewById(R.id.textview);
        myButt.setOnClickListener(this);

        data =  new MediatorLiveData<>();
        data.addSource(mvw.getAllOrders(), new Observer<Orders>() {
            @Override
            public void onChanged(Orders orders) {
                data.setValue(orders);
            }
        });
        data.addSource(mvw.getAllOrderRows(), new Observer<OrderRows>() {
                    @Override
                    public void onChanged(OrderRows orderRows) {
                        data.setValue(orderRows);

                    }
        });
        data.observe(this, new Observer<Orders>() { 
                    @Override
                    public void onChanged(Orders order) {
                        myView.setText(mvw.extractDate(order)); 
                         //Here i want to manipulate order and orderrows
                        Log.i("livedata" , order.getOrders().toString());
                    }
                });

    }

    @Override
    public void onClick(View view) {
        switch(view.getId()){
            case R.id.button:
                Log.i("button","clicked");
                mvw.updateOrderData(); // calls for new values to be fetched
                mvw.updateOrderRowData();
        }
    }
}

问题是,我似乎只能听两个现场数据之一。如何等待两者都完成,然后对它们进行一些操作?

【问题讨论】:

    标签: java android retrofit android-livedata


    【解决方案1】:

    您可以编写一个 MergedMediatorLiveData 类,如下所示:

    class MergedLiveData<T, K, S>(sourceA: LiveData<T>, sourceB: LiveData<K>, private val mergedCallback: (resultA: T?, resultB: K?) -> S) : MediatorLiveData<S>() {
    
          private var resultA: T? = null
          private var resultB: K? = null
    
          init {
            super.addSource(sourceA) {
              resultA = it
              value = mergedCallback(resultA, resultB)
            }
            super.addSource(sourceB) {
              resultB = it
              value = mergedCallback(resultA, resultB)
            }
          }
        }
    

    所以你的用法是:

         val sample = MergedLiveData(sourceA = mvw.getAllOrders(), sourceB = mvw.getAllOrderRows())
          { resultA: OrderRows?, resultB: Orders? ->
            // Todo manipulate order and orderRows 
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 2022-01-18
      • 2021-08-17
      • 1970-01-01
      • 2020-11-06
      • 2011-07-01
      • 2016-08-19
      相关资源
      最近更新 更多