Java 我如何归还孩子';从Android中的一个方法得到的Firebase中的s值?
我正在尝试使用特定用户的UID获取该用户的详细信息。我需要一个方法,可以返回一个字符串类型的用户名,以便我可以存储它,并显示在我的应用程序中Java 我如何归还孩子';从Android中的一个方法得到的Firebase中的s值?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试使用特定用户的UID获取该用户的详细信息。我需要一个方法,可以返回一个字符串类型的用户名,以便我可以存储它,并显示在我的应用程序中 getUserName("UID"); 这就是我的数据库的样子- 这就是我试着做的- private String getUserName(String startedBy) { mProfileRef=database.getReference("Profile").child(startedBy).child("UserDetails")
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提供正确的用户名。该方法不返回用户名。它返回null。如何返回用户名?这是因为
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) {
}
});
public class yourActivity implements OnDataLoaded
4-在活动/片段中使用界面。
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) {
}
});
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
操作是异步执行的。这意味着方法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) {
}
});
public class yourActivity implements OnDataLoaded
4-在活动/片段中使用界面。
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) {
}
});
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代码也在同一类中,您可以直接在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的回答也是一个很好的解决方案。如果您的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的答案也是一个很好的解决方案。@Dumbo它是需要用户名的用户的UID可能重复的请检查重复项以查看发生这种情况的确切原因。@Dumbo它是需要用户名的用户的UID可能重复的请检查重复项以查看确切原因为什么会发生这种情况。将所有firebase代码从您的活动中分离出来是一个非常好的解决方案。(Y) MyFragment实现OnDataLoaded。当我调用getUsername()时,我应该传递什么作为我的第二个参数?传递
this
作为第二个参数。非常好的解决方案,可以将所有firebase代码从您的活动中分离出来。(Y) MyFragment实现OnDataLoaded。当我调用getUsername()时,我应该传递什么作为我的第二个参数?传递this
作为第二个参数。