1

Je comprends les concepts de base de la fuite de mémoire en Java (c'est-à-dire, certains objets inutiles sont encore référencés par d'autres et ne peuvent pas être GCed).Que se passe-t-il en interne pendant une fuite de fenêtre Android?

Comment puis-je mapper ce concept à l'exception WindowLeaked dans Android?

Par exemple, le code suivant générerait une exception WindowLeaked lorsque changer l'orientation pendant AsyncTask exécution. Dans ce cas, quels objets maintiennent toujours les références inutiles? ProgressDialog ou le Activity?

public class WindowLeakedTestActivity extends AppCompatActivity { 
    ... 
    static class MyTask extends AsyncTask<Void, Void, String> { 
     Context context; 
     private ProgressDialog mProgress; 

     public MyTask(Context c) { 
      context = c; 
     } 

     protected void onPreExecute() { 
      super.onPreExecute(); 
      mProgress = ProgressDialog.show(context, "hello world", "wait", true, true); 
     } 

     protected String doInBackground(Void... params) { 
      try { 
       Thread.sleep(8000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      return ""; 
     } 
    } 
} 

Répondre

0

WindowLeaked est causée par ProgressDialog parce que l'évolution de l'activité rotation provoque Android pour détruire et charger à nouveau.

Par conséquent, vous devez appeler mProgress.dismiss() avant que votre activité soit détruite.

+0

merci de répondre! mais pourquoi 'progressdialog' devient fuit quand' activity' est détruit? – JackWM

+0

http://stackoverflow.com/a/21986772/966550 – waqaslam

+0

Bon lien. Mais il ne répond pas qui détient les références à 'progressdialog' de sorte qu'il ne peut pas être GCed. – JackWM

0

Vous n'avez pas montré le type de contexte que vous utilisez (activité ou application). Le problème principal n'est même pas avec la barre de progression mais un contexte. Toute classe statique peut survivre à l'appel d'une activité et si la classe statique contient un contexte, elle empêche le propriétaire de ce contexte d'être récolté pendant les changements de configuration.

Vous pouvez utiliser AsyncTaskLoader qui respecte le cycle de vie de l'activité.