Android: AlertDialog causa um vazamento de memória
A minha aplicação mostra umAlertDialog
com umListView
dentro. Tudo funcionou bem coque, então eu decidi testar isso para vazamentos de memória. Depois de executar o aplicativo por algum tempo, abriESTEIR e gerou o relatório Suspeitos de vazamento. A MAT encontrou vários vazamentos semelhantes:
Uma instância de "com.android.internal.app.AlertController $ RecycleListView" carregado por "<carregador de classes do sistema>" ocupa ...
Passei muito tempo procurando o motivo desse vazamento. A revisão de código não me ajudou e comecei a pesquisar no Google. Foi o que eu encontrei:
Decidi verificar se esse bug se reproduz ou não. Para esse fim, criei um pequeno programa que consiste em duas atividades.MainActivity
é um ponto de indignação. Ele contém apenas um botão que executaLeakedActivity
. Este último mostra apenas umAlertDialog
no seuonCreate()
método. Aqui está o código:
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 relata vazamentos de aplicativoscom.android.internal.app.AlertController$RecycleListView
toda vez que oAlertDialog
é descartado e oLeakedActivity
está terminado
Não consigo encontrar nenhum erro neste pequeno programa. Parece um caso muito simples de usarAlertDialog
e deve funcionar bem, mas parece que não. Então, eu gostaria de saber como evitar vazamentos de memória ao usarAlertDialog
s com itens. E por que esse problema ainda não foi resolvido? Desde já, obrigado