例如,如果数据存在则在圈子中搜索用户圈我希望它处理过程1并且如果数据不存在我想要它创建一个然后DO过程2 ...但是如果数据在此代码中会发生什么不存在它会创建一个然后执行流程2然后返回然后检查后执行流程1。那么如何在进程2之后停止监听器。 对不起,如果圆圈示例太模糊,但这是我能想到的最简单的例子。
Firebase ref= new Firebase("https://XXXXX.firebaseio.com/circles/");
Query queryRef = ref.orderByChild("circalename").equalTo(user.circalename);
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot datasnapshot) {
if (datasnapshot.exists()) { // I don't want to get back here after
//creating the data in the else statement
// DO process 1
}
// if my data doesnt exist I will create one after that STOP listening
else {
// create circle
// do process 2
}
}
答案 0 :(得分:8)
您可以使用addListenerForSingleValueEvent
因为它只听一次事件
即。在你的情况下
queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot)
{
if (datasnapshot.exists()) {
// code if data exists
} else {
// code if data does not exists
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
答案 1 :(得分:3)
尽管Shubham Arora's answer是这种情况的最佳解决方案,但我将向您展示如何使用这两个非常简单的解决方案完全按照您的要求进行操作:
boolean
boolean
并在满足条件后进行更改:
query.addListenerForSingleValueEvent(new ValueEventListener() {
boolean processDone = false;
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists() && !processDone) {
// do process 1
} else {
// do process 2
processDone = true;
}
}
@Override public void onCancelled(DatabaseError databaseError) {}
});
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
// do process 1
} else {
// do process 2
query.removeEventListener(this);
}
}
@Override public void onCancelled(DatabaseError databaseError) {}
});
当我使用ChildEventListener
并且Shubham Arora's answer无法帮助时,这两种解决方案都适用于我。