输入 OnDataChange FireBase Android 时应用程序崩溃
Posted
技术标签:
【中文标题】输入 OnDataChange FireBase Android 时应用程序崩溃【英文标题】:App Crashes when enter OnDataChange FireBase Android 【发布时间】:2016-01-14 17:14:24 【问题描述】:当我尝试将 DataSnapshot 转换为 Hashmap 时出现错误。
private void ponerCasoEnLista()
final ArrayList<DatosCaso> datos = new ArrayList<>();
RUTA_DB.child("casos").addValueEventListener(new ValueEventListener()
@Override
public void onDataChange(DataSnapshot snapshot)
HashMap<String, String> casos = (HashMap<String, String>) snapshot.getValue();
for (Object caso : casos.values())
HashMap<String, Object> casoMap = (HashMap<String, Object>) caso;
DatosCaso nuevosdatos = new DatosCaso((String) casoMap.get("nombre"), (String) casoMap.get("color"));
datos.add(nuevosdatos);
Log.d("NUEVOCASO", "Agrego caso al array");
/* if (!userInfoList.contains(userNumber))
String name = (String) userMap.remove("username");
String pic = (String) userMap.remove("profile_picture");
UserInfo info = new UserInfo(userNumber, name, pic);
userInfoList.add(info);
*/
// thread executing here can get info from database and make subsequent call
Collections.addAll(datos);
ponerCasoEnListview(datos);
我明白了:
10-16 00:30:22.951 15066-15066/? E/androidRuntime: FATAL EXCEPTION: main 进程:com.example.gasti.escribocaso1510,PID:15066 java.lang.ClassCastException:java.lang.Long 无法转换为 java.util.HashMap 在 com.example.gasti.escribocaso1510.ActividadPrincipal$2.onDataChange(ActividadPrincipal.java:109)
在 OnDataChange 之后的这一行中:
HashMap<String, String> casos = (HashMap<String, String>) snapshot.getValue();
【问题讨论】:
以下可能的答案。如果不是这样,请编辑您的问题以包含 JSON 的 sn-p。 【参考方案1】:要转换为 HashMap,只需使用
@Override
public void onDataChange(DataSnapshot dataSnapshot)
Map<String, Object> objectMap = (HashMap<String, Object>) dataSnapshot.getValue();
Log.e("***", "onDataChange -> " + objectMap.toString());
【讨论】:
【参考方案2】:没有看到你的数据结构就不可能确定,但我猜casos
是多个caso
对象的列表。
在这种情况下:
public void onDataChange(DataSnapshot snapshot)
for (Object caso : casos.values())
HashMap<String, Object> casoMap = (HashMap<String, Object>) caso;
DatosCaso nuevosdatos = new DatosCaso((String) casoMap.get("nombre"), (String) casoMap.get("color"));
您应该认真考虑为 DatosCaso 创建一个 JavaBean 对象:
public class DatosCaso
String nombre;
String color;
public DatosCaso()
public String getNombre() return nombre;
public String getColor() return color;
这可以让你绕过HashMap:
DatosCaso nuevosdatos = caso.getValue(DatosCaso.class);
【讨论】:
以上是关于输入 OnDataChange FireBase Android 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章
为啥触发 Firebase onDataChange() 方法后,我的 Google Map 会不断创建新的地图实例?
Firebase onDataChange Listener 是不是总是在应用程序关闭后自动删除?或者,不是而且账单也在增加?