等待异步调用完成Android LiveData的执行
我正在开发一个使用MVVM架构的Android应用程序。这个函数从我的存储库返回要从ViewModel中观察的MutableLiveData等待异步调用完成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
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(咖啡店)
//根据具体情况,使用最上面的一行
}
}
});
}
现在,您不需要等待数据收集,只要数据在侦听器方法中准备好,就可以预测更改。您可以签出。