Pregunta

Estoy teniendo problema con la memoria después de ejecutar muchas veces mi aplicación.

java.lang.OutOfMemoryError: tamaño de mapa de bits excede presupuesto VM

Calculo que tenía una fuga de memoria de alguna manera así que hice un archivo de volcado HPROF y se utiliza la herramienta de MAT de averiguar lo que estaba mal. Resulta que después de correr como 5 veces la aplicación y chihuahuenses, encuentro 5 casos de mi actividad y 5 casos de PhoneStateListener.

Si quito la llamada a PhoneStateListener, que no tienen ese problema más y veo sólo 1 instancia de mi actividad.

La pregunta es, ¿cómo puedo solucionar esto?

Gracias

Daniel


Aquí está mi código:

OnCreate método:

telephonyManager.listen(mPhoneListener,
                PhoneStateListener.LISTEN_SERVICE_STATE
                | PhoneStateListener.LISTEN_SIGNAL_STRENGTH
                | PhoneStateListener.LISTEN_CALL_STATE
                | PhoneStateListener.LISTEN_DATA_CONNECTION_STATE
                | PhoneStateListener.LISTEN_DATA_ACTIVITY); 

en la clase Actividad:

PhoneStateListener mPhoneListener = new PhoneStateListener() {
        public void onCallStateChanged(int state,
                java.lang.String incomingNumber) {
        //do something
    }
}

en el método OnDestroy:

telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE);        
mPhoneListener = null;
¿Fue útil?

Solución

OnDestroy no está garantizada a ser llamado. Fuente: OnDestroy Docs

Usted debe tratar de limpiar el onPause y luego onResume reconducir las cosas que necesita. Esto ayudará a limpiar un poco de presión y fugas de memoria.

Otros consejos

No OnDestroy () es un problema aquí como matar el proceso será, obviamente, libre de toda la memoria y carpetas

La respuesta anterior no es correcta.

Hay un elemento muy importante que hay que tener en cuenta aquí. El aglutinante registrado con el gerente de la telefonía solamente se dará a conocer después del objeto de aglutinante asociado en el proceso del sistema ha sido puesto en libertad. Esto puede ser mucho tiempo después de la anulación del registro correctamente el oyente, ya que puede tomar algún tiempo antes de la siguiente CG carrera en el proceso del sistema recupera el objeto y con el que la referencia a su oyente.

Lo mejor que puede hacer es quitar manualmente las referencias del oyente a otros objetos cuando haya terminado con él en OnDestroy ().

PhoneStateListener mPhoneListener = new PhoneStateListener() 
{ 
    public void onCallStateChanged(int state, java.lang.String incomingNumber) 
    { 
    //do something 

     telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_NONE); 
     mPhoneListener = null;
    } 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top