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

我正在尝试访问用户名以显示在屏幕上,我正在从我的 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 并崩溃。


有什么帮助吗?


侃侃无极
浏览 155回答 1
1回答

宝慕林4294392

数据从 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() 方法返回一个空列表
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java