java - 如何从 Android 中的方法返回 Firebase 中子项的值?

标签 java android firebase firebase-realtime-database

我正在尝试使用特定用户的 UID 获取其用户详细信息。我需要一个可以将 userName 作为 String 类型返回的方法,以便我可以存储它并将其显示在我的应用程序中。

getUserName("UID");

这就是我的数据库的样子 - enter image description here

这就是我尝试做的 -

 private String getUserName(String startedBy) {
    mProfileRef=database.getReference("Profile").child(startedBy).child("UserDetails").child("userName");
    mProfileRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            userName = dataSnapshot.getValue(String.class);
            Log.i(TAG, "onDataChange: "+userName);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    return userName;
}

Log 语句执行完美,并根据 UID 给出正确的用户名。该方法不返回用户名。它返回空值。如何返回用户名?

最佳答案

这是因为 Firebase 操作是异步执行的。这意味着 onDataChange 方法在后台线程上执行,同时您的 UI 线程执行原始方法并返回值,而无需等待 Firebase 响应。

该解决方案可以通过使用接口(interface)来完成。

1 - 定义接口(interface)

public interface OnDataLoaded {

   onDataLoaded(String username);

}

2 - 将接口(interface)作为方法参数传递

public void getUserName(String startedBy, OnDataLoaded onDataLoaded)

3 - 使用界面传递用户名。

mProfileRef = database.getReference("Profile").child(startedBy).child("UserDetails").child("userName");
mProfileRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        userName = dataSnapshot.getValue(String.class);
        onDataLoaded.onDataLoaded(username);
        Log.i(TAG, "onDataChange: "+userName);

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

4 - 使用 Activity/Fragment 中的界面。

public class yourActivity implements OnDataLoaded 

5 - 您的控件将被转移到您的 Activity 方法 onDataLoaded

@Override
public void onDataLoaded(String userName) {
    // your userName will be available here.
    // you can use your bindings here.
}

注意:在没有任何 IDE 的情况下编写。可能包含一些语法错误。

关于java - 如何从 Android 中的方法返回 Firebase 中子项的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49549646/

相关文章:

java - 在 Android SDK 2.5 上尝试使用 SKAnnotations(紫色针标记类型)查看 map 时偶尔会看到黑色矩形覆盖 SKMap

java - 如何在 Java SE 11 中使用自定义注解?

android - 设备位置验证

Firebase 存储安全规则错误 - 用户没有权限

node.js - 从nodejs调用firebase云函数

python - Firestore 中具有服务帐户的细化权限

如果所有者最小化,则 Javafx 对话框(警报)不可见

java - 模式方法匹配返回 false

android - android&BADA平台最大应用大小

android - 支持库版本问题