2016-12-10 1 views
2

Dies ist mein ValueEventListener in OnCreate-Methode. Ich möchte dies zerstören ist OnDestroy Methode, weil es Speicherverlust verursachen kann und auch ich habe es gelesen, dass es eine gute Praxis ist, dies zu tun.Wie entferne ich diesen Listener in OnDestroy (Android Firebase)?

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

Antwort

3

Wenn Sie den Listener registrieren, erhalten Sie ein Handle für den Listener zurück. Halten Sie, dass Zuhörer in einem Mitgliedsfeld:

private ValueListener mListener; 

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

Und dann nehmen Sie den Hörer in Ihrem onDestroy():

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

Sie jeden Zuhörer entfernen können removeEventListener Methode .Sie Speicherleck Probleme so klare Erinnerung an Ihre Glide Bibliothek in OnDestroy wie diese

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

} 
+0

es gibt mir einen Fehler über ValueEventListener, mir "Expression Expected" zu sagen. –

0

Direkt unter Code setzen in onDestroy()

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

Mit Bezug von @Frank van Puffelen Antwort. Code ändern zu:

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

in onDestry():

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

Für diejenigen, für die Firestor Firebase suchen Version dieser Antwort Verwenden ListenerRegistration und rufen Sie dann .remove() auf es in onDestroy ()

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

} 
Verwandte Themen