Android: AlertDialog causa una pérdida de memoria
Mi aplicación muestra unAlertDialog
con unListView
dentro. Todo funcionó bien, entonces decidí probar esto para detectar pérdidas de memoria. Después de ejecutar la aplicación por un tiempo abríESTER y generó un informe de sospechosos de fugas. MAT encontró varias fugas similares:
Una instancia de "com.android.internal.app.AlertController $ RecycleListView" cargado por "<cargador de clases del sistema>" ocupa ...
Pasé mucho tiempo buscando la razón de esta filtración. La revisión del código no me ayudó y comencé a buscar en Google. Eso es lo que encontré:
Issue 5054: AlertDialog parece causar una pérdida de memoria a través de un mensaje en MessageQueue
Decidí comprobar si este error se reproduce o no. Para este propósito, creé un pequeño programa que consta de dos actividades. @MainActivity
es un punto de entrada. Contiene solo un botón que ejecutaLeakedActivity
. Este último solo muestra unaAlertDialog
en suonCreate()
método. Aquí está el 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 informa que esta aplicación tiene fugascom.android.internal.app.AlertController$RecycleListView
cada vez que elAlertDialog
es despedido y elLeakedActivity
Está terminado
No puedo encontrar ningún error en este pequeño programa. Parece un caso muy simple de usarAlertDialog
y debe funcionar bien, pero parece que no. Así que me gustaría saber cómo evitar pérdidas de memoria al usarAlertDialog
s con artículos. ¿Y por qué no se ha solucionado este problema todavía? Gracias por adelantado