我正在尝试读取数据库中的节点并返回在单个方法中检索的值。当我运行代码时,数据记录在控制台上,但该方法返回一个空值。
我所知道的:
我知道Firebase会在后台自动检索/同步数据库,因此最后会执行onDataChanged中的代码。
我不知道:
如何让我的方法返回从onDataChanged方法获得的值。
我的代码:
public static String telephone;
public static String getMyNumber(){
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
DatabaseReference r = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("phone");
r.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
telephone = dataSnapshot.getValue(String.class);
Log.d("YourTag", telephone);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return telephone;
}
答案 0 :(得分:0)
欢迎使用异步编程。当您通过调用addValueEventListener
来附加监听器时,您的应用不会自动获取该值(或者onDataChange
不会直接调用。
如果您要在检索telephone
后更新UI,请将代码放在onDataChange
方法中。
希望这会有所帮助:)
答案 1 :(得分:0)
要获取该值,您应该使用回调:
例如:
private InterfaceListener mListenerForResult;
public Contructor(InterfaceListener listener) {
this.mListenerForResult = listener;
}
public static String telephone;
public static String getMyNumber(){
final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
DatabaseReference r = FirebaseDatabase.getInstance().getReference().child("users").child(user.getUid()).child("phone");
r.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
telephone = dataSnapshot.getValue(String.class);
Log.d("YourTag", telephone);
mListenerForResult.obtainValue(telephone);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return telephone;
}
interface InterfaceListener {
obtainValue(String telephone);
}
从另一个班级:
您应该实现此接口,并通过构造函数。