addChildEventListener(Firebase)中的数组问题

时间:2019-03-19 13:39:09

标签: java android firebase firebase-realtime-database

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

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

  

如果我尝试将数组的数据放入 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];

i 不会为空

1 个答案:

答案 0 :(得分:2)

Firebase API为asynchronous,这意味着这些方法中的每一个:onChildAdded()onChildChanged()等,在调用后立即返回,并且将从其返回的Task中进行回调过一会儿再打来。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。由于该方法会立即返回,因此尚未从回调中填充scores数组,这就是为什么为空的原因。

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

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

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

onChildAdded()方法中,有可用数据。

如果您需要在回调之外循环score数组,建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何可以使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。