Integer scores[] = new Integer[10];
int count = 0;
我有一些数据要放入 如果我尝试将数组的数据放入 onChildAdded ,
成功 重要时刻 例如,如果我将使用操作 FOR i 不会为空 array
中。我将其放在 onChildAdded 中,但是如果我需要从onChildAdded 中的数组中获取数据,控制台将显示“空” 。 / p>
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 (int i = 0; i < 10; ++i) {
scores[i] = i;
}
int i = scores[3];
答案 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 以获得更好的理解。