如何在OnDestroy(Android Firebase)中删除此侦听器?

时间:2016-12-10 09:37:11

标签: android firebase firebase-realtime-database

这是我在OnCreate方法中的ValueEventListener。我想破坏这是OnDestroy方法,因为它可能导致内存泄漏,而且我已经读过它,这是一个很好的做法。

mDatabase.child(mPost_key).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            display_author = (String) dataSnapshot.child("author").getValue();
            display_quote = (String) dataSnapshot.child("quote").getValue();
            display_pic_url = (String) dataSnapshot.child("pic_url").getValue();
            categoryData=(String) dataSnapshot.child("catg").getValue();
            display_prof=(String) dataSnapshot.child("prof").getValue();
            copyQuote = (display_quote + " - " +display_author);
            try {
                author.setText(display_author);
                quote.setText(display_quote);
                category.setText(categoryData);
                profession.setText(display_prof);
                Glide.with(SingleExploreQuotes.this).load(display_pic_url).override(192, 192).into(profile_img);

            } catch (Exception e) {
                finish();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });

6 个答案:

答案 0 :(得分:11)

注册监听器时,会返回监听器的句柄。将该侦听器保留在成员字段中:

private ValueListener mListener;

mListener = mDatabase.child(mPost_key).addValueEventListener(new ValueEventListener() {

然后删除onDestroy()中的侦听器:

mDatabase.child(mPost_key).removeListener(mListener);

答案 1 :(得分:1)

参考@Frank van Puffelen的回答。将代码更改为:

private ValueEventListener mListener;
mListener = mDatabaseRef.addValueEventListener(new ValueEventListener() 
{...}
onDestry()中的

@Override
    protected void onDestroy() {
        super.onDestroy();
        mDatabaseRef.removeEventListener(mListener);
    }

答案 2 :(得分:1)

要复制Firestore的ListenerRegistration行为并具有相同的无缝实现,我还实现了一个名为ListenerRegistration的自定义类,该类接受一个DatabaseReference和一个侦听器对象,即ChildEventListenerValueEventListener

import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.ValueEventListener;

import org.jetbrains.annotations.NotNull;

public class ListenerRegistration {

    private DatabaseReference mDatabaseReference;
    private Object mListener;

    ListenerRegistration(@NotNull DatabaseReference databaseReference,
                         @NotNull Object listener) {
        if (listener instanceof ChildEventListener || listener instanceof ValueEventListener) {
            mDatabaseReference = databaseReference;
            mListener = listener;
        } else {
            throw new IllegalArgumentException("Listener type invalid");
        }
    }

    public void remove() {
        if (mListener instanceof ChildEventListener) {
            mDatabaseReference.removeEventListener((ChildEventListener) mListener);
        } else if (mListener instanceof ValueEventListener) {
            mDatabaseReference.removeEventListener((ValueEventListener) mListener);
        } else {
            throw new IllegalArgumentException("Listener type invalid");
        }
    }

}

这样,每次我附加一个侦听器时,我都会保留该值,然后根据需要调用.remove()。例如

ValueEventListener listener = {...}
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(NODE_ROOT).child(NODE_SAMPLE);
ListenerRegistration lr = new ListenerRegistration(dbRef, listener);

然后像onDestroy()这样的地方:

lr.remove()

答案 3 :(得分:0)

你可以使用removeEventListener方法删除任何监听器。你遇到了内存泄漏问题,所以你的Glide库的内存清除就像这样吗

@Override 
public void onDestroy() {
super.onDestroy();
//removelistener
mDatabase.child(mPost_key).removeEventListener(ValueEventListener);
Glide.get(this).clearMemory();//clear memory

}

答案 4 :(得分:0)

将下面的代码放在onDestroy()

@Override
protected void onDestroy() {
    super.onDestroy();
    if(!isFinishing()){
    mDatabase.child(mPost_key)..addValueEventListener(null);
  }
}

答案 5 :(得分:0)

对于那些寻找此答案的Firebase Firestore 版本的人,请使用ListenerRegistration,然后在onDestroy()上调用.remove()

private ListenerRegistration listenerRegistration;

listenerRegistration = Reference.addsnapshotListener(new 
EventListener<QuerySnapshot>){
  @Override
        public void onEvent(QuerySnapshot documentSnapshots, 
        FirebaseFirestoreException e) {
         //get your data

  }
});


@Override
protected void onDestroy() {
    super.onDestroy();

    if(listenerRegistration != null) {
        listenerRegistration.remove();
    }

}