这是我的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) {
}
});
发布于 2016-12-11 02:34:27
当您注册侦听器时,您将获得侦听器的句柄。将侦听器保留在成员字段中:
private ValueListener mListener;
mListener = mDatabase.child(mPost_key).addValueEventListener(new ValueEventListener() {
然后删除onDestroy()
中的监听器
mDatabase.child(mPost_key).removeListener(mListener);
发布于 2017-12-05 18:23:40
参考@Frank van Puffelen的答案。将代码更改为:
private ValueEventListener mListener;
mListener = mDatabaseRef.addValueEventListener(new ValueEventListener()
{...}
在onDestry()中:
@Override
protected void onDestroy() {
super.onDestroy();
mDatabaseRef.removeEventListener(mListener);
}
发布于 2018-07-25 17:17:13
为了复制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()
https://stackoverflow.com/questions/41074095
复制相似问题