因此,我正在使用Firebase实时数据库,并且希望在满足特定条件时立即删除侦听器。这是我的代码:
final DatabaseReference forRequests = FirebaseDatabase.getInstance().getReference(Common.requests + "/" + FirebaseAuth.getInstance().getUid());
listenForRequests = forRequests.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
pickuprequest.riderUID = (String) dataSnapshot.child(Common.riderUID).getValue();
if (pickuprequest.riderUID != null) {
forRequests.removeEventListener(listenForRequests);
showRequestOnMap(forRequests);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
}
listenForRequests是一个全局变量。我只是想知道这段代码是否可以工作,或者是否有更好的解决方案,因为我觉得它很hacky。
答案 0 :(得分:0)
我不能真正说出您的条件到底想表达什么,但是如果您一次只想从数据库中获取一个值(而不必听其随时间的变化),则可以简单地使用{{3 }},以获取数据库中节点的单个快照。
如果您正在等待一个以前不存在的值出现,并且想要在出现该值时停止监听,那么您正在做的事情就很好了。但是您可能想更仔细地听感兴趣的孩子,而不是其父母。
答案 1 :(得分:0)
当您要等待特定的值时,您的代码对我而言非常惯用。
实际上,我的gist on waiting for an initial value中的代码非常相似:
mListener = ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if (snapshot.exists()) {
System.out.println("The value is now "+snapshot.getValue());
ref.removeEventListener(mListener);
}
}
...