等待异步调用完成Android LiveData的执行

等待异步调用完成Android LiveData的执行,android,firebase,android-livedata,android-mvvm,Android,Firebase,Android Livedata,Android Mvvm,我正在开发一个使用MVVM架构的Android应用程序。这个函数从我的存储库返回要从ViewModel中观察的MutableLiveData public MutableLiveData<ArrayList<CoffeeShop>> getCoffeeShops(){ setCoffeeShops(); MutableLiveData<ArrayList<CoffeeShop>> data = new Mut

我正在开发一个使用MVVM架构的Android应用程序。这个函数从我的存储库返回要从ViewModel中观察的MutableLiveData

    public MutableLiveData<ArrayList<CoffeeShop>> getCoffeeShops(){
        setCoffeeShops();
        MutableLiveData<ArrayList<CoffeeShop>> data = new MutableLiveData<>();
        data.setValue(coffeeShops);
        return data;
    }

    public void setCoffeeShops() {
        CollectionReference coffeeShopsRef = database.collection("coffee_shops");
        coffeeShopsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>(){
            @Override
            public void onComplete(@NonNull Task< QuerySnapshot > task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        CoffeeShop coffeeShop = new CoffeeShop();
                        coffeeShop.setName((String) document.get("name"));
                        coffeeShop.setLocation((GeoPoint) document.get("location"));
                        coffeeShop.setOffers((ArrayList<String>) document.get("offers"));
                        coffeeShop.setRating((Long) document.get("rating"));
                        coffeeShop.setReviews((ArrayList<Review>) document.get("reviews"));
                        coffeeShops.add(coffeeShop);
                    }
                }
            }
        });
    }
public MutableLiveData getCoffeeShops(){
设置咖啡店();
MutableLiveData=新的MutableLiveData();
数据设置值(咖啡店);
返回数据;
}
公共咖啡店{
CollectionReference coffeeShopsRef=数据库.collection(“咖啡店”);
coffeeShopsRef.get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull TaskTask){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){
咖啡店咖啡店=新咖啡店();
coffeeShop.setName((字符串)document.get(“name”);
coffeeShop.setLocation((GeoPoint)document.get(“location”);
coffeeShop.setOffers((ArrayList)document.get(“offers”);
咖啡店。设置((长)文档。获取(“评级”);
coffeeShop.setReviews((ArrayList)document.get(“reviews”);
咖啡店。添加(咖啡店);
}
}
}
});
}
函数的作用是:执行对数据库的异步调用,并设置coffeeShops变量的值。我需要找到一种方法来等待异步调用被解析,然后才将值分配给MutableLiveData对象。这是解决问题的正确方法吗?如果是,你会推荐什么

谢谢大家!

试试这个:

使用回调参数设置咖啡店()

例如:
setCoffeeShops(可运行回调)

当您的咖啡店设置完成后,调用回调:

callback.run()

当你打电话给setCoffeeShops时,要这样做:

MutableLiveData<ArrayList<CoffeeShop>> data = new MutableLiveData<>();
setCoffeeShops(()->{  
    data.setValue(coffeeShops);
});
return data;
    interface CoffeeShopLoader {
        void shopsLoaded(List<CoffeeShop> shops);
    }

    void setCoffeeShops(CoffeeShopLoader loader)  {
        ...

        loader.shopsLoaded(coffeeShops);
    }

    ... // and call it like this

       setCoffeeShops((shops)->{
           data.setValue(shops)
       });

    ...


我想推荐
Room
数据库框架。它支持
Livedata
,并且有很好的ORMapper。因此,通过简单的对象模型,您可以达到目标,并减少代码以达到目标

下面的链接向您展示了一个很好的方法:

但是,如果您没有任何迁移到房间的计划,只需按以下方式更改您的喜好:

public MutableLiveData getCoffeeShops(){
MutableLiveData=新的MutableLiveData();
设置咖啡店(数据);
返回数据;
}
公共void setCoffeeShops(可变LiveData数据){
CollectionReference coffeeShopsRef=数据库.collection(“咖啡店”);
coffeeShopsRef.get().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull TaskTask){
if(task.issusccessful()){
对于(QueryDocumentSnapshot文档:task.getResult()){
咖啡店咖啡店=新咖啡店();
/*数据转换码*/
咖啡店。添加(咖啡店);
}
//如果在主线程上运行
数据设置值(咖啡店)
//否则
数据.postValue(咖啡店)
//根据具体情况,使用最上面的一行
}
}
});
}
现在,您不需要等待数据收集,只要数据在侦听器方法中准备好,就可以预测更改。

您可以签出。