Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Firebase值事件侦听器是否在活动完成后仍启动?_Java_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Java Firebase值事件侦听器是否在活动完成后仍启动?

Java Firebase值事件侦听器是否在活动完成后仍启动?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我一直在和firebase合作,我注意到了一些奇怪的事情。 我在活动中注册的一个值事件侦听器即使在我完成活动后也会被激发。 我已经在“onDataChanged”方法中添加了打开新活动的代码,因此即使我在不同的活动中,也会打开新活动。这在应用程序中造成了很大的问题。 我知道我必须调用remove listener,但我希望在活动完成后会自动删除该侦听器。是否有一种更简单的方法可以删除活动的所有值事件侦听器?提前感谢。离开主活动后,您需要删除侦听器。为此,您可以创建如下方法: private Ha

我一直在和firebase合作,我注意到了一些奇怪的事情。 我在活动中注册的一个值事件侦听器即使在我完成活动后也会被激发。 我已经在“onDataChanged”方法中添加了打开新活动的代码,因此即使我在不同的活动中,也会打开新活动。这在应用程序中造成了很大的问题。
我知道我必须调用remove listener,但我希望在活动完成后会自动删除该侦听器。是否有一种更简单的方法可以删除活动的所有值事件侦听器?提前感谢。

离开主活动后,您需要删除侦听器。为此,您可以创建如下方法:

private HashMap<DatabaseReference, ValueEventListener> hashMap = new HashMap<>();
public static void removeValueEventListener(HashMap<DatabaseReference, ValueEventListener> hashMap) {
    for (Map.Entry<DatabaseReference, ValueEventListener> entry : hashMap.entrySet()) {
        DatabaseReference databaseReference = entry.getKey();
        ValueEventListener valueEventListener = entry.getValue();
        databaseReference.removeEventListener(valueEventListener);
    }
}

而不仅仅是调用
removevalueventlistener(hashMap)根据活动生命周期。您可以在
onPause()
onStop()方法中添加此行。通过这种方式您可以一次删除所有侦听器

还有一种稍微不同的方法

    mReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
         //Your initial code:
         .....
        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            mReference.removeEventListener(this);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            mReference.removeEventListener(this);
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
            mReference.removeEventListener(this);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            mReference.removeEventListener(this);
        }
    });

并不是说这是最好的方法,但它帮助我解决了这个问题

对于像我这样刚开始在Android Studio工作的人来说,他们并没有马上理解我们的答案,下面是一个简短的例子:

首先声明Firebase和HashMap变量,如下所示

private DatabaseReference NotifyGroupRef;
private ValueEventListener valueEventListener;
private HashMap<DatabaseReference, ValueEventListener> groupCreatorAndKeys = new HashMap<>();
NotifyGroupRef = FirebaseDatabase.getInstance().getReference().child("NotifyGroup");
private void updateNotifyGroupInternet(String groupCreator, String groupKey) {

    NotifyGroupRef.child(groupCreator).child(groupKey).addValueEventListener(valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            String[] splittedSnapshot = dataSnapshot.getValue().toString().split("=");
            String clientId = splittedSnapshot[0].replace("{","");
            String notification = splittedSnapshot[1].replace("}", "");

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    groupCreatorAndKeys.put(NotifyGroupRef.child(groupCreator).child(groupKey), valueEventListener);

}
@Override
public void onPause() {
    super.onPause();

    for (Map.Entry<DatabaseReference, ValueEventListener> entry : groupCreatorAndKeys.entrySet()) {
        DatabaseReference databaseReference = entry.getKey();
        ValueEventListener value = entry.getValue();
        databaseReference.removeEventListener(value);
    }


}
创建一个函数来添加您的侦听器,如下所示

private DatabaseReference NotifyGroupRef;
private ValueEventListener valueEventListener;
private HashMap<DatabaseReference, ValueEventListener> groupCreatorAndKeys = new HashMap<>();
NotifyGroupRef = FirebaseDatabase.getInstance().getReference().child("NotifyGroup");
private void updateNotifyGroupInternet(String groupCreator, String groupKey) {

    NotifyGroupRef.child(groupCreator).child(groupKey).addValueEventListener(valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            String[] splittedSnapshot = dataSnapshot.getValue().toString().split("=");
            String clientId = splittedSnapshot[0].replace("{","");
            String notification = splittedSnapshot[1].replace("}", "");

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    groupCreatorAndKeys.put(NotifyGroupRef.child(groupCreator).child(groupKey), valueEventListener);

}
@Override
public void onPause() {
    super.onPause();

    for (Map.Entry<DatabaseReference, ValueEventListener> entry : groupCreatorAndKeys.entrySet()) {
        DatabaseReference databaseReference = entry.getKey();
        ValueEventListener value = entry.getValue();
        databaseReference.removeEventListener(value);
    }


}
启动以下新活动时停止收听

private DatabaseReference NotifyGroupRef;
private ValueEventListener valueEventListener;
private HashMap<DatabaseReference, ValueEventListener> groupCreatorAndKeys = new HashMap<>();
NotifyGroupRef = FirebaseDatabase.getInstance().getReference().child("NotifyGroup");
private void updateNotifyGroupInternet(String groupCreator, String groupKey) {

    NotifyGroupRef.child(groupCreator).child(groupKey).addValueEventListener(valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {


            String[] splittedSnapshot = dataSnapshot.getValue().toString().split("=");
            String clientId = splittedSnapshot[0].replace("{","");
            String notification = splittedSnapshot[1].replace("}", "");

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

    groupCreatorAndKeys.put(NotifyGroupRef.child(groupCreator).child(groupKey), valueEventListener);

}
@Override
public void onPause() {
    super.onPause();

    for (Map.Entry<DatabaseReference, ValueEventListener> entry : groupCreatorAndKeys.entrySet()) {
        DatabaseReference databaseReference = entry.getKey();
        ValueEventListener value = entry.getValue();
        databaseReference.removeEventListener(value);
    }


}
@覆盖
公共无效暂停(){
super.onPause();
对于(Map.Entry:groupCreatorAndKeys.entrySet()){
DatabaseReference DatabaseReference=entry.getKey();
ValueEventListener值=entry.getValue();
databaseReference.removeEventListener(值);
}
}
最后,在返回活动时按backbutton再次添加侦听器,例如:

@Override
public void onStart() {
    super.onStart();

    for (Map.Entry<DatabaseReference, ValueEventListener> entry : groupCreatorAndKeys.entrySet()) {
        DatabaseReference databaseReference = entry.getKey();
        ValueEventListener value = entry.getValue();
        databaseReference.addValueEventListener(value);
    }

}
@覆盖
public void onStart(){
super.onStart();
对于(Map.Entry:groupCreatorAndKeys.entrySet()){
DatabaseReference DatabaseReference=entry.getKey();
ValueEventListener值=entry.getValue();
databaseReference.addValueEventListener(值);
}
}

在我的示例中,我通过变量
groupCreator
groupKey
使用了不同的路径,它工作得非常好

Firebase数据库侦听器没有上下文绑定。您需要在正确的活动生命周期事件的代码中明确删除它们,如Alex的回答中所述。是否有任何方法将其附加到上下文?我不想手动执行此操作,因为每个活动中都有很多侦听器。请参阅我的更新答案。正如我所说的,Firebase数据库侦听器不受上下文限制。你必须在代码中跟踪它们,并按照Alex所示分离它们。嘿,谢谢你的回答,但我已经知道了。我想知道是否有其他方法可以同时删除所有侦听器?因为手工操作要花很长时间。是的,实际上是有。请看我的最新答案。