Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MediatorLiveData是否可以等待两个livedata也接收更新?_Java_Android_Retrofit_Android Livedata - Fatal编程技术网

Java MediatorLiveData是否可以等待两个livedata也接收更新?

Java MediatorLiveData是否可以等待两个livedata也接收更新?,java,android,retrofit,android-livedata,Java,Android,Retrofit,Android Livedata,正如标题所说。我有两个livedata对象,它们从API获取一些数据。我想等待两个livedata在对其值执行某些操作之前完成数据的提取。 这就是我到目前为止所做的: public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button myButt; private MainViewModel mvw; private TextView m

正如标题所说。我有两个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();
        }
    }
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener{
私人按钮;
私有主视图模型mvw;
私有文本视图myView;
私有数据;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
mvw=新的ViewModelProvider(this.get)(MainViewModel.class);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButt=findViewById(R.id.按钮);
myView=findviewbyd(R.id.textview);
myButt.setOnClickListener(this);
data=新的MediatorLiveData();
data.addSource(mvw.getAllOrders(),new Observer()){
@凌驾
更改后的公共作废(订单){
数据设置值(订单);
}
});
data.addSource(mvw.getAllordErrors(),new Observer()){
@凌驾
更改后的公共void(OrderRows OrderRows){
data.setValue(orderRows);
}
});
data.observe(这个,新的观察者(){
@凌驾
更改后的公共作废(订单){
myView.setText(mvw.extractDate(order));
//这里我想处理order和orderrows
Log.i(“livedata”,order.getOrders().toString());
}
});
}
@凌驾
公共void onClick(视图){
开关(view.getId()){
案例R.id按钮:
Log.i(“按钮”,“点击”);
mvw.updateOrderData();//调用要获取的新值
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)
        }
      }
    }

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