2016-12-10 2 views
2

これは、OnCreateメソッドのValueEventListenerです。私はこれがOnDestroyメソッドを破壊しようとしています。なぜなら、メモリリークを引き起こしている可能性があり、そうすることも良い習慣であると読んだからです。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) { 
     } 
    }); 

答えて

3

リスナーを登録すると、リスナーへのハンドルが戻されます。

private ValueListener mListener; 

mListener = mDatabase.child(mPost_key).addValueEventListener(new ValueEventListener() { 
をしてから onDestroy()でリスナーを削除します:メンバーフィールドにそのリスナーを保つ

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

あなたは。あなたはただ、onDestroyでのコードの下に入れ、この

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

} 
+0

「Expression Expected」と言って、ValueEventListenerにエラーが表示されます。 –

0

()

ようondestroyであなたのグライドライブラリのメモリリークの問題それほど明確メモリに直面は、removeEventListenerメソッドを使用して、任意のリスナーを削除することができます
@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if(!isFinishing()){ 
    mDatabase.child(mPost_key)..addValueEventListener(null); 
    } 
} 
0

@FrankバンPuffelenの答えの参照して。 onDestryで

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

():に変更コード、その後

この回答使用ListenerRegistrationのFirebase Firestoreバージョンをお探しの方に
@Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     mDatabaseRef.removeEventListener(mListener); 
    } 
0

と(.removeを呼ぶ)、その上に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(); 
    } 

} 
関連する問題