无法从Firebase Database获取数据,无回调且应用崩溃如何解决?
问题根因
- Firebase Realtime Database的
get()方法是异步执行的,你在try代码块中仅完成了请求的提交,onComplete/onFailure回调需要等待网络请求返回后才会触发,不会阻塞当前线程继续执行后续代码。 - 触发崩溃的
StorageReference gsReference = FirebaseStorage.getInstance().getReferenceFromUrl(path)代码不在try块包裹范围内,所以try/catch完全捕获不到这个异常。 - 执行到读取
mProfilePicUrl的代码时,数据库请求还没返回,MainActivity.mUser刚调用过clearUser(),所有属性都是null,传入空path给getReferenceFromUrl就触发了日志里的IllegalArgumentException: location must not be null or empty崩溃。
修复方案
把所有依赖数据库返回结果的代码,全部移动到onComplete回调内部,等请求成功拿到数据后再执行,修改后参考代码如下:
private void getUserProfileInfo() { MainActivity.mUser.clearUser(); FirebaseAuth auth = FirebaseAuth.getInstance(); Log.i("..............UID Used", auth.getCurrentUser().getUid()); FirebaseDatabase firebaseDatabase = FirebaseDatabase .getInstance("https://godsvong-default-rtdb.firebaseio.com/"); DatabaseReference databaseReference = firebaseDatabase.getReference(); databaseReference.child("User_Profiles").child(auth.getCurrentUser().getUid()) .get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() { @Override public void onComplete(@NonNull Task<DataSnapshot> task) { if (task.isSuccessful()) { MainActivity.mUser = task.getResult().getValue(User.class); Log.i("Get Data", "SUCCESS!!!!!"); MainActivity.mUser.showUserDataInCatlog(); // 所有依赖mUser数据的逻辑移到这里执行 String path = MainActivity.mUser.getmProfilePicUrl(); if (path != null && !path.isEmpty()) { StorageReference gsReference = FirebaseStorage.getInstance() .getReferenceFromUrl(path); // 后续处理storage的逻辑写在这里 } else { Log.i("Get Data", "用户头像路径为空"); } } else { Log.e("Get Data", "请求失败", task.getException()); } } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.i("Get Data", "FAILED!!!!!"); } }); }
额外排查点(若调整异步逻辑后仍拿不到数据)
- 检查Realtime Database的权限规则是否允许当前认证用户读取
User_Profiles节点下对应uid的数据,近期如果调整过规则可能会导致权限被拦截 - 检查User类的字段名是否和数据库节点的字段名完全匹配,有无大小写、拼写错误,有无添加混淆规则排除User类,混淆可能导致序列化失败返回null
- 检查对应uid的节点下是否确实存在
mProfilePicUrl字段,值是否有效非空
内容的提问来源于stack exchange,提问作者Victor Humphrey
相关产品推荐
相关产品推荐

