You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从Firebase Database获取数据,无回调且应用崩溃如何解决?

问题根因
  1. Firebase Realtime Database的get()方法是异步执行的,你在try代码块中仅完成了请求的提交,onComplete/onFailure回调需要等待网络请求返回后才会触发,不会阻塞当前线程继续执行后续代码。
  2. 触发崩溃的StorageReference gsReference = FirebaseStorage.getInstance().getReferenceFromUrl(path)代码不在try块包裹范围内,所以try/catch完全捕获不到这个异常。
  3. 执行到读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 05:39:01