gpt4 book ai didi

java - Android-Expected a List while deserializing, but got a class java.util.HashMap

转载 作者:太空狗 更新时间:2023-10-29 13:03:47 26 4
gpt4 key购买 nike

我想在 Android 中从 Firebase 获取所有餐厅列表。 my database

这是我的代码:

boolean delivery;
String openTime, closeTime, restaurantName;
long likes;
List<String> utilities;

List<RestaurantModel> listRes;

DatabaseReference dataResReference;

public RestaurantModel(){
dataResReference = FirebaseDatabase.getInstance().getReference().child("restaurants");
}

public List<RestaurantModel> getallRestaurant(){

listRes = new ArrayList<>();
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataValues : dataSnapshot.getChildren()){
RestaurantModel restaurantModel = dataValues.getValue(RestaurantModel.class);
listRes.add(restaurantModel);
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
};
dataResReference.addListenerForSingleValueEvent(valueEventListener);
return listRes;
}

但我得到一个异常(exception)

Expected a List while deserializing, but got a class java.util.HashMap

在 RestaurantModel restaurantModel = dataValues.getValue(RestaurantModel.class);

更新:基于 Alex Mamo answser,我更改了我的代码:

public void getAllRestaurant(final WhereInterface whereInterface){
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//go to node restaurant because datasnapshot is parent node
DataSnapshot dataSnapshotRes = dataSnapshot.child("restaurants");
//

for (DataSnapshot valueRes : dataSnapshotRes.getChildren()){
RestaurantModel restaurantModel = valueRes.getValue(RestaurantModel.class);
whereInterface.getAllRestaurantModel(restaurantModel);

}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
};
databaseReferenceRoot.addListenerForSingleValueEvent(valueEventListener);
}

但我仍然遇到这个异常 (:.

谁知道为什么?

有解决办法吗?

非常感谢!

最佳答案

您的代码中有两个问题。第一个是这个错误:

Expected a List while deserializing, but got a class java.util.HashMap

可以使用以下代码行解决:

ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<RestaurantModel> listRes = new ArrayList<>();

for (DataSnapshot dataValues : dataSnapshot.getChildren()){
RestaurantModel restaurantModel = dataValues.getValue(RestaurantModel.class);
listRes.add(restaurantModel);
}

//Do what you need to do with listRes
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); //Don't ignore errors
}
};
dataResReference.addListenerForSingleValueEvent(valueEventListener);

第二个问题是您现在无法返回尚未加载的内容。 Firebase API 是异步,这意味着 onDataChange() 方法在被调用后立即返回,它返回的 Task 的回调将在稍后调用。无法保证需要多长时间。因此,在数据可用之前可能需要几百毫秒到几秒。由于该方法会立即返回,因此您尝试返回的 listRes 列表将由于此方法的异步行为而为空。

基本上,您正在尝试从异步 API 同步返回一个值。那不是一个好主意。您应该按预期异步处理 API。

这个问题的一个快速解决方案是只在 onDataChange() 方法中使用 listRes 列表(如上面的代码行),否则我建议你从这个 post 看到我回答的最后一部分 我在其中解释了如何使用自定义回调来完成。你也可以看看这个 video 以便更好地理解。

编辑:

public void getAllRestaurant(){
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<RestaurantModel> listRestaurant = new ArrayList<>();

for (DataSnapshot valueRes : dataSnapshot.getChildren()){
RestaurantModel restaurantModel = valueRes.getValue(RestaurantModel.class);
Log.d("Test", restaurantModel.getRestaurantName());
listRestaurant.add(restaurantModel);
}

//Do what you need to do with listRes
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
};
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("restaurants").addListenerForSingleValueEvent(valueEventListener);
}

关于java - Android-Expected a List while deserializing, but got a class java.util.HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51380056/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com