Android: AlertDialog provoque une fuite de mémoire

Mon application affiche un AlertDialog avec un ListView à l'intérieur. Tout a bien fonctionné chignon puis j'ai décidé de tester ce pour des fuites de mémoire. Après l'exécution de l'application pour un certain temps, j'ai ouvert MAT et a généré une Fuite des Suspects rapport. MAT trouvé plusieurs fuites:

Une instance de "com.android.interne.app.AlertController$RecycleListView" chargé par "<système de chargeur de classe>" occupe ...

J'ai passé beaucoup de temps à chercher la raison de cette fuite. La révision du Code ne m'a pas aidé et j'ai commencé une recherche sur google. C'est ce que j'ai trouvé:

Question 5054: AlertDialog semble provoquer une fuite de mémoire par le biais d'un Message dans le MessageQueue

J'ai décidé de vérifier si ce bug se reproduit ou pas. Pour cela j'ai créé un petit programme qui se compose de deux activités. MainActivity est un enrty point. Il ne contient que des boutons qui s'exécute LeakedActivity. Le dernier est juste un AlertDialog dans son onCreate() méthode. Voici le code:

public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.button).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
startActivity(
new Intent(MainActivity.this, LeakedActivity.class));
}
});
}
}
public class LeakedActivity extends Activity {
private static final int DIALOG_LEAK = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
showDialog(DIALOG_LEAK);
}
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == DIALOG_LEAK) {
return new AlertDialog.Builder(this)
.setTitle("Title")
.setItems(new CharSequence[] { "1", "2" },
new OnClickListener() {
private final byte[] junk = new byte[10*1024*1024];
@Override
public void onClick(DialogInterface dialog, int which) {
//nothing
}
})
.create();
}
return super.onCreateDialog(id);
}
}

MAT les rapports de cette application fuites com.android.internal.app.AlertController$RecycleListView chaque fois que le AlertDialog est rejeté, et la LeakedActivity est fini.

Je ne trouve pas d'erreur dans ce petit programme. Il ressemble à un cas très simple d'utilisation AlertDialog et il faut bien travailler mais il semble qu'il ne l'est pas. Donc je voudrais savoir comment faire pour éviter les fuites de mémoire lors de l'utilisation de AlertDialogs avec les éléments. Et pourquoi n'est-ce pas ce problème été encore fixée? Merci à l'avance.

InformationsquelleAutor Michael | 2011-08-16