为了账号安全,请及时绑定邮箱和手机立即绑定

有效地从 Firebase 数据库中获取用户数据

有效地从 Firebase 数据库中获取用户数据

侃侃无极 2021-11-24 15:46:14
我正在尝试访问用户名以显示在屏幕上,我正在从我的 Firebase 数据库中检索用户名。获取用户名的代码有点长,myRef.addListenerForSingleValueEvent(new ValueEventListener() {        @Override        public void onDataChange(DataSnapshot dataSnapshot) {            String userName = dataSnapshot.child("userName").getValue(String.class);            navUsername.setText(userName);        }        @Override        public void onCancelled(DatabaseError databaseError) {            throw databaseError.toException();        }    });因此,我试图让那段代码返回一个名为“specUserName”的字符串,这样我就可以轻松地从任何类访问它,而不必每次都放入那个冗长的代码字符串。在我的 User.class 中,我添加了这个    public String getUserName() {    myRef.addListenerForSingleValueEvent(new ValueEventListener() {        @Override        public void onDataChange(DataSnapshot dataSnapshot) {            specUserName = dataSnapshot.child("userName").getValue(String.class);        }        @Override        public void onCancelled(DatabaseError databaseError) {            throw databaseError.toException();        }    });    return specUserName;}我试图通过这样做在我的 HomePage.class 中检索它    users.getUserName();    navUsername.setText(users.specUserName);但是现在,每当我打开主页时,它都会崩溃,这是我在 Logcat 中收到的错误。java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.brent.fifty_fifty.User.getUserName()' on a null object reference    at com.example.brent.fifty_fifty.HomePage.onCreateOptionsMenu(HomePage.java:84)HomePage:84 是我调用 getUserName() 方法的地方,但它一直返回 null 并崩溃。有什么帮助吗?
查看完整描述

1 回答

?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

数据从 Firebase 异步加载。由于您不能getUserName等到数据可用(这意味着您的应用程序变得无响应),因此您无法像这样返回用户名。


要了解原因,请放置一些日志记录语句,如下所示:


System.out.println("Before attaching listener");

myRef.addListenerForSingleValueEvent(new ValueEventListener() {

    @Override

    public void onDataChange(DataSnapshot dataSnapshot) {

        System.out.println("Got data");

    }


    @Override

    public void onCancelled(DatabaseError databaseError) {

        throw databaseError.toException();

    }

});

System.out.println("After attaching listener");

当您运行此代码时,它会打印:


在附加侦听器之前


附加监听器后


得到数据


这可能不是您所期望的。但它确实解释了为什么您不能返回用户名。到return语句执行时,数据还没有加载,onDataChange()也没有被调用。


有两种常见的解决方法:


将需要用户名的代码移动到getUserName方法中。这是迄今为止最简单的getUserName方法,但会降低您的方法的可重用性。

创建一个回调接口,您传入该接口,getUserName然后在加载用户名时调用该接口。这类似于ValueEventListener.onDataChangeFirebase 本身的内容,但特定于您的应用程序逻辑。

我建议您不要在此处显示两者的代码,而是在此处查看我的答案:getContactsFromFirebase() 方法返回一个空列表


查看完整回答
反对 回复 2021-11-24
  • 1 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信