2016-04-25 16 views
5

Nell'applicazione in cui sto lavorando vedo una perdita di memoria in un DialogFragment e l'unico modo per risolverlo finora è stato rimuovere tutte le viste quando il DialogFragment viene distrutto, è una cosa normale dover fare? Sto lavorando con una ROM personalizzata quindi non ero sicuro se forse questo ha qualcosa a che fare con questo problema. C'è qualche ragione per NON rimuovere tutte le viste dalla finestra di dialogo causerebbe perdite di memoria?DialogFragment che perde memoria

@Override 
    public void onDestroyView() { 
     if (getView() instanceof ViewGroup) { 
      ((ViewGroup)getView()).removeAllViews(); 
     } 
     super.onDestroyView(); 
    } 
+1

per confermare che si dovrebbe provare anche su telefono non-rooted –

risposta

4

MemoryLeak può accadere per molte cause, alcune cause comuni:

  • Tenere riferimento del vostro oggetto (in questo caso istanza del DialogFragment) in alcuni campi statici.
  • Passo Context a Discussione o AsyncTask perché le discussioni è anche GC root!
  • La classe ha classe interna non statica, in questo caso, perdita di memoria accadere se classe interna correlate a radice GC (per esempio se classe interna è istanza di AsyncTask).

Nel tuo caso forse hai una vista relativa a GC root, mentre quella vista non può essere garbage collection la tua finestra di dialogo che mantiene le viste anche non può essere garbage collection.

5

Questo accade alla mia App troppo e ho trovato la perdita utilizzando Leakcanary.

Succede quando si dispone di una finestra di dialogo con EditText. Il Blink of the Cursor, che viene implementato utilizzando una callback, non viene gestito correttamente quando si chiude la vista che contiene EditText. E succede per caso secondo questo.

https://code.google.com/p/android/issues/detail?id=188551

Modifica

e questo è come quello che faccio prima di ogni dialog.dismiss():

editText.setCursorVisible(false); 
dismiss(); 

Spero che questo aiuti!