// Group node listener were all the user group messages arriving
public void listenToGroupNode() {
Log.i("FireBase", "listenToGroupNode");
try {
final List<UserGroups> dataFromDataBase = new UserGroupsActions(dbHelper).getAllUserGroups();
for (int i = 0; i < dataFromDataBase.size(); i++) {
final String groupId = dataFromDataBase.get(i).getId();
if (!listenedUserGroups.contains(groupId)) {
listenedUserGroups.add(groupId);
try {
Firebase mFirebaseRef = new Firebase(Constants.FIRE_BASE_URL).child(Constants.CHAT_TYPE_GROUP + File.separator + groupId);
childEventListeners.add(mFirebaseRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
ChatData chatData = dataSnapshot.getValue(ChatData.class);
if (!messagesActions.isMessageAvailable(chatData.getMessageId()))
handleReceivedMessage(groupId, chatData);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
handleRemovedMessage(dataSnapshot.getKey());
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
}));
} catch (Exception e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
我写的上述方法是听用户中的一些群组在聊天应用程序中,用户可以拥有超过100个组,我用循环来通过内联创建回调来监听每个节点好现在我想在用户点击退出时删除所有这些监听器,我该怎么做
答案 0 :(得分:1)
由于您已经保留了一个监听器列表:
childEventListeners.add(mFirebaseRef.addChildEventListener(new ChildEventListener() {....
您可以通过循环删除所有这些内容并为每个调用removeEventListener()
。
另请参阅此问题:How stop Listening to firebase location in android
当您取消注册侦听器时,Firebase服务器将停止发送消息。 可能是客户端中的一些挥之不去的事件,但这是一个非常小的数字,通常不值得关注。
如果您想关心并保证在用户退出时不再处理任何事件,您可以在事件中保留自己的布尔值isLoggedIn
和if (isLoggedIn)
。