我该怎么做而不是等待FirebaseDatabase数据?

时间:2016-12-23 18:37:26

标签: java firebase firebase-realtime-database listener

我的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(),这非常糟糕:(

1 个答案:

答案 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
        }
    }
});