簡體   English   中英

即使在活動完成后 Firebase 值事件偵聽器也會觸發?

[英]Firebase value event listener firing even after activity is finished?

我一直在使用 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);
    }
}

每次要刪除列表器時,都可以使用以下代碼行:

hashMap.put(yourRef, eventListener);

不僅僅是調用removeValueEventListener(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 並且沒有立即理解Alex Mamo的答案的人,這里有一個簡短的例子:

首先聲明您的 Firebase 和 HashMap 變量,如下所示。

private DatabaseReference NotifyGroupRef;
private ValueEventListener valueEventListener;
private HashMap<DatabaseReference, ValueEventListener> groupCreatorAndKeys = new HashMap<>();

之后,在onCreate 中分配您的 Firebase 參考,如下所示。

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);
    }


}

最后,在通過按下后退按鈕返回活動時再次添加偵聽器,例如:

@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);
    }

}

在我的示例中,我通過變量groupCreatorgroupKey使用了不同的路徑,並且效果很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM