我的FirebaseDatabase存在问题。我想从日期库引用中读取子项的数量。我想这样做5次。所以我创建了5个SingleEventListeners并设置了值,如果这个日期没有用户的话。 (我希望你明白,我想做什么:D)
while (counter<5) {
... We create a new date and username here. We have to do this 5 times
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!(dataSnapshot.child(finalDate).hasChild(username)))
myRef.child(finalDate).child(username).setValue(true);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
counter++;
}
try { //TODO Synchronisation is not given without that block
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
...
...
...
myRef.child(chosenDate).child(username).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
participate.setChecked((Boolean) dataSnapshot.getValue());
}
如果我们不等待接收日期,我们会得到一个Nullpointer异常。 我可以做什么而不是使用sleep(),这非常糟糕:(
答案 0 :(得分:0)
Thread.sleep()
几乎不是你想要的解决方案。在这种情况下,由于您知道要加载的项目数量,因此您只需计算已加载(或绝对无法加载)的项目数量:
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!(dataSnapshot.child(finalDate).hasChild(username)))
myRef.child(finalDate).child(username).setValue(true);
counter++;
if (counter == 5) {
// TODO: whatever you want to do after all items have loaded
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
counter++;
if (counter == 5) {
// TODO: whatever you want to do after all items have loaded
}
}
});