我正在尝试使用特定用户的 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 给出正确的用户名。该方法不返回用户名。它返回空值。如何返回用户名?
最佳答案
这是因为 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/