【问题标题】:How can I Return a Child's Value in Firebase from a Method in Android?如何从 Android 中的方法返回 Firebase 中的子值?
【发布时间】:2018-03-29 06:45:48
【问题描述】:

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

getUserName("UID");

这就是我的数据库的样子 -

这是我尝试做的 -

 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 提供正确的用户名。该方法不返回用户名。它返回空值。如何返回用户名?

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案1】:

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

解决方案可以通过使用界面来完成。

1 - 定义接口

public interface OnDataLoaded {

   onDataLoaded(String username);

}

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

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 - 您的控制权将转移给您的活动方法 onDataLoaded

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

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

【讨论】:

  • 非常好的解决方案,可以将所有 firebase 代码与您的活动分开。 (Y)
  • MyFragment 实现 OnDataLoaded。当我调用 getUsername() 时,我应该传递什么作为我的第二个参数?
  • 传递 this 作为第二个参数。
【解决方案2】:

鉴于您的 firebase 代码也在同一类中,您可以在回调中直接更新您的视图以进行 firebase 数据库读取。

private void getUserName(String startedBy, TextView textView) {
    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);
            textView.setText(userName);
            Log.i(TAG, "onDataChange: "+userName);

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

Waqas Pervez 的回答也是一个很好的解决方案。

【讨论】:

    猜你喜欢
    • 2018-07-08
    • 2014-05-14
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2023-03-29
    相关资源
    最近更新 更多