MediatorLiveData是否可能等待两个livedata也接收更新



正如标题所说。我有两个livedata对象,它们从API获取一些数据。我想等待两个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();
}
}
}

问题是,我似乎只能听两个实时数据中的一个。我如何才能等待两者都完成,然后对两者进行一些操作?

您可以按照如下方式编写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 
}

最新更新