0

Une application simple avec recyclerview dans le fragment a une fuite de mémoire selon l'application des fuites.Fuites de mémoire dans RecyclerView lorsqu'il est utilisé dans Fragment par LeakCanary

Memory Leak snapshot by Leak App

Stack de la fuite:

HelloTest.java:

public class HelloTest extends AppCompatActivity { 
    private TestFrag mFrag = null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (savedInstanceState == null) { 
      mFrag = new TestFrag(); 
      getSupportFragmentManager() 
        .beginTransaction() 
        .replace(android.R.id.content, mFrag) 
        .commit(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     RefWatcher refWatcher = AppClass.getRefWatcher(this); 
     refWatcher.watch(this); 

    } 
} 

Fragment:

public class TestFrag extends Fragment { 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.activity_hello_test, container, false); 

     return view; 
    } 
} 

XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/comme_rv" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     /> 

</RelativeLayout> 
En exécutant le code d'application ci-dessus, une fuite de mémoire se produit lorsque l'application se termine.

Si le même code est placé dans l'activité au lieu de fragment alors il n'y a pas de fuite. Est-ce que je fais quelque chose de mal?

Répondre

0

Vous ne devez rien créer dans la méthode onDestroy. Si vous mettez votre code comme ceci:

public class HelloTest extends AppCompatActivity { 
    private TestFrag mFrag = null; 
    RefWatcher refWatcher; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     refWatcher = AppClass.getRefWatcher(this); 
     refWatcher.watch(this); 
     if (savedInstanceState == null) { 
      mFrag = new TestFrag(); 
      getSupportFragmentManager() 
        .beginTransaction() 
        .replace(android.R.id.content, mFrag) 
        .commit(); 
     } 
    } 

    @Override 
    public void onDestroy() { 

     if(refWatcher!=null){ 
      // destroy refWatcher 
     } 
     super.onDestroy(); 
    } 
} 
+0

Merci pour les suggestions, j'ai fatigué cela, mais la question est toujours là. – Wasim

+0

S'il vous plaît, mettez votre code que vous avez essayé avec onDestroy. Essayez ceci: public void onBackPressed() { if (refWatcher == null) {// détruire refWatcher } super.onBackPressed();} – MrTy

+0

J'ai enlevé la méthode OnDestroy. Le problème existe toujours – Wasim