从Firestore获取数据始终无法成功完成的问题求助
Firestore读取数据未触发onSuccess排查方案
- 首先补全异常监听定位报错,你当前仅配置了成功回调,未捕获执行过程中抛出的异常,添加失败监听和完成监听即可快速定位根因:
docRef.get() .addOnSuccessListener(documentSnapshot -> { User userFromDB = documentSnapshot.toObject(User.class); }) .addOnFailureListener(e -> { // 此处打印e的堆栈信息即可看到具体错误,比如权限问题、序列化失败、文档不存在等 Log.e("FirestoreRead", "读取失败", e); }) .addOnCompleteListener(task -> { // 无论成功失败都会走这里,可用来确认请求是否真正发出 Log.d("FirestoreRead", "请求执行完毕,是否成功:" + task.isSuccessful()); });
- 检查User类是否满足序列化要求,除了字段匹配、存在get方法外,必须包含一个public的无参数构造方法,否则Firestore无法反射实例化User类,会抛出异常直接走失败回调。如果项目开启了ProGuard混淆,需要将User类加入混淆白名单,避免字段和get方法被混淆后无法匹配。
- 确认文档路径真实存在,登录Firebase控制台查看
users集合下,是否存在ID完全等于abc@gmail.com的文档,注意ID大小写、特殊字符、多余空格都需要完全匹配,文档不存在也不会走到成功回调。 - 确认安全规则已生效,你配置的全通规则需要在Firebase控制台规则页面点击发布后才会生效,未发布的规则不会生效。
- 检查网络与权限配置,确认AndroidManifest.xml中已添加
INTERNET权限,当前设备网络可以正常访问Firebase服务,未被代理、防火墙拦截。 - 确认Firebase实例初始化正确,排查是否初始化时关联了错误的Firebase项目,导致读写的不是同一个数据库实例。
- 避免监听器被提前回收,不要将
DocumentReference仅定义为局部变量,方法执行完毕后实例会被垃圾回收,回调无法正常触发,改为类成员变量即可解决。
内容的提问来源于stack exchange,提问作者Prescila
相关产品推荐
相关产品推荐

