小编典典

addChildEventListener(Firebase)中的数组问题

java

Integer scores[] = new Integer[10];
int count = 0;

我有一些要输入的数据array。我将其放在 onChildAdded中 ,但是如果我需要从数组 中获取onChildAdded之外的数据
,控制台将显示 “ null”

如果我尝试将数组的数据放入 onChildAdded中 ,它将成功

data.child("scores").addChildEventListener(new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        count++;
                        scores[count] = dataSnapshot.getValue(Integer.class);
                    }

                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {

                    }

                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

int i = scores[1];

重要时刻

例如,如果我将使用 FOR

for (int i = 0; i < 10; ++i) {
        scores[i] = i;
    }

    int i = scores[3];

不会为空


阅读 247

收藏
2020-11-30

共1个答案

小编典典

FirebaseAPI是asynchronous,表示这些方法中的每个方法onChildAdded()onChildChanged()等等,在调用后立即返回,并且它返回的Task的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。因为该方法立即返回,所以scores尚未从回调中填充该数组,这就是为什么为空的原因。

基本上,您尝试从异步的API同步使用值。那不是一个好主意。您应该按预期异步处理API。

快速解决此问题的方法是移动以下代码行:

for (int i = 0; i < 10; ++i) {
    scores[i] = i;
}
int i = scores[3];

onChildAdded()方法内部,数据可用的位置。

如果您需要循环的score数组回调外,我建议你看我anwser从这个最后的部分
,其中我已经解释了如何可以使用自定义的回调来完成。您也可以观看此
视频 ,以更好地理解。

2020-11-30