这是我在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) {
}
});
答案 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
和一个侦听器对象,即ChildEventListener
或ValueEventListener
。
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();
}
}