如何从onDataChanged方法返回数据

时间:2016-11-28 11:27:00

标签: java firebase-realtime-database

我正在尝试读取数据库中的节点并返回在单个方法中检索的值。当我运行代码时,数据记录在控制台上,但该方法返回一个空值。

我所知道的

我知道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;
}

2 个答案:

答案 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);
}

从另一个班级:

您应该实现此接口,并通过构造函数。