首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MediatorLiveData有没有可能等待两个livedata来接收更新?

MediatorLiveData有没有可能等待两个livedata来接收更新?
EN

Stack Overflow用户
提问于 2020-03-12 02:01:13
回答 1查看 108关注 0票数 1

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

代码语言:javascript
复制
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();
        }
    }
}

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

EN

回答 1

Stack Overflow用户

发布于 2020-03-14 00:33:13

您可以按如下方式编写MergedMediatorLiveData类:

代码语言:javascript
复制
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)
        }
      }
    }

所以你的用法是:

代码语言:javascript
复制
     val sample = MergedLiveData(sourceA = mvw.getAllOrders(), sourceB = mvw.getAllOrderRows())
      { resultA: OrderRows?, resultB: Orders? ->
        // Todo manipulate order and orderRows 
      }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60642058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档