如何从firebase数据库ValueEventListener传递值?

时间:2018-02-16 15:11:05

标签: android firebase firebase-realtime-database

在firebase数据库和android中我很安静,我创建了一个计算db子目录总大小的方法,但是当在onDataChange方法之外访问时它总是返回0,这里是我的代码

private int getChildSize() {
 final List<String> keys = new ArrayList<>();
 DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("profiles");
    ref.orderByChild("phoneNumber")
            .equalTo(phoneNumber)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot item : dataSnapshot.getChildren()){
                        keys.add(item.getKey());

                        Log.d(TAG, "onDataChange: " + keys.size()); // more than 0
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

 return keys.size(); // return 0;
}

任何想法?

2 个答案:

答案 0 :(得分:1)

Firebase调用是异步的,因此您需要结果才能返回,然后才能返回。你可以做的是在calll完成时调用一个方法:

private void getChildSize() {
 final List<String> keys = new ArrayList<>();
 DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("profiles");
    ref.orderByChild("phoneNumber")
            .equalTo(phoneNumber)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot item : dataSnapshot.getChildren()){
                        keys.add(item.getKey());

                        Log.d(TAG, "onDataChange: " + keys.size()); // more than 0
                    }
                    finishedCounting(keys.size())

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

}

public void finishedCounting(int size){
//do something with size
}

答案 1 :(得分:0)

拆分该功能:

将您的ValueEventListener放入一个单独的init函数中,该函数没有返回类型(void)。

并使getChildSize函数仅返回大小。

由于ValueEventListener是异步的,因此在调用return语句之前不会分配任何值。