首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在OnDestroy (Android Firebase)中删除此监听器?

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

Stack Overflow用户
提问于 2016-12-10 17:37:11
回答 5查看 11.4K关注 0票数 7

这是我的OnCreate方法中的ValueEventListener。我想销毁这是OnDestroy方法,因为它可能会导致内存泄漏,而且我读到它是一个很好的做法。

代码语言:javascript
复制
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) {
        }
    });
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-12-11 02:34:27

当您注册侦听器时,您将获得侦听器的句柄。将侦听器保留在成员字段中:

代码语言:javascript
复制
private ValueListener mListener;

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

然后删除onDestroy()中的监听器

代码语言:javascript
复制
mDatabase.child(mPost_key).removeListener(mListener);
票数 14
EN

Stack Overflow用户

发布于 2017-12-05 18:23:40

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

代码语言:javascript
复制
private ValueEventListener mListener;
mListener = mDatabaseRef.addValueEventListener(new ValueEventListener() 
{...}

在onDestry()中:

代码语言:javascript
复制
@Override
    protected void onDestroy() {
        super.onDestroy();
        mDatabaseRef.removeEventListener(mListener);
    }
票数 2
EN

Stack Overflow用户

发布于 2018-07-25 17:17:13

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

代码语言:javascript
复制
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()。例如:

代码语言:javascript
复制
ValueEventListener listener = {...}
DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference(NODE_ROOT).child(NODE_SAMPLE);
ListenerRegistration lr = new ListenerRegistration(dbRef, listener);

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

代码语言:javascript
复制
lr.remove()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41074095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档