gpt4 book ai didi

android - onChildRemoved() 被多次调用

转载 作者:搜寻专家 更新时间:2023-11-01 08:38:18 25 4
gpt4 key购买 nike

我正在为我的 Android 应用程序使用 firebase 数据库。我为其中一个 firebase 节点设置了 ChildEventListener。当该节点的直接子节点被删除时,onChildRemoved() 应该被调用一次,但在我的例子中它被调用了多次。

我认为发生这种情况的原因是因为我在整个应用程序的多个位置为同一节点设置了 ChildEventListener,因为当我设置 ChildEventListener 一次我的应用程序,onChildRemoved() 方法在每个删除的 child 被调用一次,这符合预期。

fragment A

firebaseData.child("patients").addChildEventListener(new ChildEventListener() {

@Override
public void onChildRemoved(DataSnapshot dataSnapshot)
{
dataChangedforListviewInFragmentA(dataSnapShot);
}
});

fragment B

firebaseData.child("patients").addChildEventListener(new ChildEventListener() {

@Override
public void onChildRemoved(DataSnapshot dataSnapshot)
{
dataChangedforListviewInFragmentB(dataSnapShot);
}
});

fragment C

firebaseData.child("patients").addChildEventListener(new ChildEventListener() {

@Override
public void onChildRemoved(DataSnapshot dataSnapshot)
{
dataChangedforListviewInFragmentC(dataSnapShot);
}
});

在方法 dataChangedforListviewInFragment() 中,我使用更新后的数据设置了 listView。当节点 patients 的直接子节点被删除时,Fragment C 中的 onChildRemoved() 被多次调用。

是否有可能在我的应用程序的多个位置编写 ChildEventListener 并使其回调方法被调用正确的次数。谢谢。

最佳答案

当您将多个监听器添加到同一位置时,每个监听器都将在相关事件发生时被调用。

Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts");
// Create a listener
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
System.out.println(snapshot.getValue());
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
};
// Attach listeners to read the data at our posts reference
ref.addValueEventListener(listener);
ref.addValueEventListener(listener);

通过上述设置,当 posts 的值发生变化时,监听器将被调用两次,新值将被打印两次。这正是应该发生的事情。

如果您只希望监听器被调用一次,您应该只将它添加到引用中一次。如果您已经添加了它,这可以通过跟踪轻松完成。

boolean isListenerAdded = false;
// then in the first place you'r adding a listener, the code will be executed
if (!listenerAdded) {
ref.addValueEventListener(listener);
isListenerAdded = true;
}
// and in the other place, the code will be skipped
if (!listenerAdded) {
ref.addValueEventListener(listener);
isListenerAdded = true;
}

如果监听器在同一个 fragment/Activity 中,您可以将 bool 值保留在 Activity 的成员字段中。如果监听器处于不同的 Activity 中,您可以将 bool 值保留在 SharedPreferences 中。但是在那种情况下你真的应该考虑removing the listeners在每个 Activity 的 onPause() 中。

@Override
public void onPause() {
super.onPause(); // Always call the superclass method first

if (listenerAdded) {
ref.removeEventListener(listener);
}
}

关于android - onChildRemoved() 被多次调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34767281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com