¿Puede alguien explicarme por qué esta filtración?
Hola chicos soy nuevo en el desarrollo de Android y me encontré con el siguiente ejemplo de pérdida de memoria
package com.justinschultz.android; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; public class LeakedDialogActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setMessage("This dialog leaks!").setTitle("Leaky Dialog").setCancelable(false).setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {} }); AlertDialog alert = builder.create(); alert.show(); } }
No entiendo por qué se filtra en una rotación. Entiendo que se crea una nueva actividad mientras el diálogo todavía está en pantalla (que contiene una referencia a la actividad antigua). Suponga que cierra el diálogo y gira de nuevo. ¿No debería desaparecer la referencia a la actividad más antigua, permitiendo así que la memoria sea recuperada?
- ¿Cómo puedo saber cuánta memoria heap en un momento dado?
- Máxima memoria nativa que se puede asignar a una aplicación para Android
- Fuga de memoria de Android entre las actividades
- ¿Cómo puedo solucionar esta pérdida de memoria de Android que involucra Threads?
- Sqlite base de datos FUGA ENCONTRADA excepción en android?
- Las imágenes agregadas a AnimationDrawable por programación memoria de fugas
- Descripción de las fugas de memoria en una aplicación de Android
- Esta clase Handler debe ser estática o pueden producirse fugas: handler final
- Fuga de AdActivity en AdMob (SDK 7.0) para Android
- Fuga de memoria debido a android.widget.BubblePopupHelper
- Pérdida de memoria con imágenes
- Android - Firebase - ¿Necesito eliminar CADA oyente?
- Android: EditText causando una pérdida de memoria
AlertDialogs (si se utiliza fuera de fragmentos) se instancia a través de onCreateDialog()
/ showDialog()
para evitar fugas.
Esta implementación está obsoleta y debe ser reemplazada por un DialogFragment , pero funcionará para usted:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); showDialog(YOUR_DIALOG_ID); } @Override protected Dialog onCreateDialog(int id) { switch(id) { case YOUR_DIALOG_ID: return new AlertDialog.Builder(LeakedDialogActivity.this) .setIcon(android.R.drawable.ic_dialog_alert) .setMessage("This dialog leaks!") .setTitle("Leaky Dialog") .setCancelable(false) .setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {} }) .create(); } return super.onCreateDialog(id); }
ADICIONAL
Cuando usted no crea un diálogo en onCreateDialog
esencialmente no está conectado a (o es propiedad de) la actividad, y por lo tanto, es el ciclo de vida. Cuando la actividad es destruida o recreada, el diálogo mantiene una referencia a ella.
En teoría, el diálogo no debe tener fugas si utiliza setOwnerActivity()
y descartar en onPause()
(creo).
No estoy seguro de que usted tiene que preocuparse mucho acerca de esto gotcha en cuanto a fugas generales ir. Los diálogos son un caso especial.