Integer scores[] = new Integer[10]; int count = 0;
我有一些要输入的数据array。我将其放在 onChildAdded中 ,但是如果我需要从数组 中获取onChildAdded之外的数据 ,控制台将显示 “ null” 。
array
如果我尝试将数组的数据放入 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
for (int i = 0; i < 10; ++i) { scores[i] = i; } int i = scores[3];
我 不会为空
FirebaseAPI是asynchronous,表示这些方法中的每个方法onChildAdded(),onChildChanged()等等,在调用后立即返回,并且它返回的Task的回调将在一段时间后调用。无法保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。因为该方法立即返回,所以scores尚未从回调中填充该数组,这就是为什么为空的原因。
asynchronous
onChildAdded()
onChildChanged()
scores
基本上,您尝试从异步的API同步使用值。那不是一个好主意。您应该按预期异步处理API。
快速解决此问题的方法是移动以下代码行:
在onChildAdded()方法内部,数据可用的位置。
如果您需要循环的score数组回调外,我建议你看我anwser从这个最后的部分 后 ,其中我已经解释了如何可以使用自定义的回调来完成。您也可以观看此 视频 ,以更好地理解。
score