使用 firebase ValueEventListener 检测值变化
Detect value change with firebase ValueEventListener
我正在尝试检测我的 Firebase 数据库中的值变化。这是我初始化 ValueEventListener 的代码:
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
String customerLocation = String.valueOf(dataSnapshot.getValue());
Point customerPoint = locationFounder.getPoint(customerLocation);
if (customerPoint != null) {
databaseReference.child("isActive").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
boolean isActive = Boolean.valueOf(String.valueOf(dataSnapshot.getValue()));
displayPopUp(isActive, customerPoint, customerLocation);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
} catch (Exception e) {
Log.d("Listener",e.toString());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
destinationReference.addValueEventListener(valueEventListener);
当我想在 activity 中调用此侦听器时出现问题。我一直在尝试这个:
destinationListener.getValueEventListener().onDataChange(REQUIRED_SNAPSHOT);
我不知道如何获取 onDataChange 所需的数据快照。如果可能的话,我希望使用 ValueEventListener 而不是 ChildEventListener 来完成这项工作。但是,我不太确定这是尝试检测值变化的正确方法。如果有任何其他方法可以正常工作,我想知道它。
Firebase 实时数据库没有构建任何内容来告诉您快照下的哪些特定数据在 onDataChange
方法中发生了变化。
如果您想知道具体 属性 发生了什么变化,您需要:
- 将您在
onDataChange
中获得的快照保存在字段中。
- 调用
onDataChange
时,将新快照中的数据与字段中的数据进行比较。
假设您在 JSON 中的一个节点上有一个引用,并且在该节点下是一个 status
属性,并且您希望同时收听整个节点,并检测 status
是否已更改。
你会用类似的东西来做到这一点:
// Add a field to your class to keep the latest snapshot
DataSnapshot previousSnapshot;
// Then add your listener
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
bool wasActive = false;
if (previousSnapshot != null && previousSnapshot.child("status").exists()) {
wasActive = dataSnapshot.child("status").getValue(Boolean.class);
}
boolean isActive = dataSnapshot.child("status").getValue(Boolean.class);
if (isActive <> wasActive) {
... the user's status changed
}
previousSnapshot = dataSnapshot;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});
我正在尝试检测我的 Firebase 数据库中的值变化。这是我初始化 ValueEventListener 的代码:
valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
try {
String customerLocation = String.valueOf(dataSnapshot.getValue());
Point customerPoint = locationFounder.getPoint(customerLocation);
if (customerPoint != null) {
databaseReference.child("isActive").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
boolean isActive = Boolean.valueOf(String.valueOf(dataSnapshot.getValue()));
displayPopUp(isActive, customerPoint, customerLocation);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
} catch (Exception e) {
Log.d("Listener",e.toString());
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
destinationReference.addValueEventListener(valueEventListener);
当我想在 activity 中调用此侦听器时出现问题。我一直在尝试这个:
destinationListener.getValueEventListener().onDataChange(REQUIRED_SNAPSHOT);
我不知道如何获取 onDataChange 所需的数据快照。如果可能的话,我希望使用 ValueEventListener 而不是 ChildEventListener 来完成这项工作。但是,我不太确定这是尝试检测值变化的正确方法。如果有任何其他方法可以正常工作,我想知道它。
Firebase 实时数据库没有构建任何内容来告诉您快照下的哪些特定数据在 onDataChange
方法中发生了变化。
如果您想知道具体 属性 发生了什么变化,您需要:
- 将您在
onDataChange
中获得的快照保存在字段中。 - 调用
onDataChange
时,将新快照中的数据与字段中的数据进行比较。
假设您在 JSON 中的一个节点上有一个引用,并且在该节点下是一个 status
属性,并且您希望同时收听整个节点,并检测 status
是否已更改。
你会用类似的东西来做到这一点:
// Add a field to your class to keep the latest snapshot
DataSnapshot previousSnapshot;
// Then add your listener
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
bool wasActive = false;
if (previousSnapshot != null && previousSnapshot.child("status").exists()) {
wasActive = dataSnapshot.child("status").getValue(Boolean.class);
}
boolean isActive = dataSnapshot.child("status").getValue(Boolean.class);
if (isActive <> wasActive) {
... the user's status changed
}
previousSnapshot = dataSnapshot;
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // never ignore errors
}
});