2011-10-18 7 views
8

Utilicé la herramienta MAT en Eclipse para investigar un problema de pérdida de memoria y descubrí que, ocasionalmente, una instancia de subproceso de CookieSyncManager pierde mi actividad. El camino de mi actividad a raíz de GC es el siguiente:¿Se ha filtrado la memoria (fuga de actividad) causada por CookieSyncManager?

com.mycompany.myapp.MyActivity 
    --> mContext com.android.internal.policy.impl.PhoneFallbackEventHandler 
    --> mFallbackEventHandler android.view.ViewRoot 
     --> target android.os.Message 
     --> <java local> java.lang.Thread CookieSyncManager Thread 

MyActivity llamada CookieSyncManager.createInstance (this.getApplicationContext()); en onCreate(), pero no usa ninguna vista web. Solo contiene algunas animaciones. No entiendo por qué es filtrado por CookieSyncManager. ¿Alguien puede ayudar?

Gracias.

+0

cualquier webview ...? – Blackbelt

+0

Sin vista web. CookieSyncManager es utilizado por otra actividad, pero no esta actividad. – Kai

+0

Me rindo .. lo siento – Blackbelt

Respuesta

1

Puede llamar a CookieSyncManager.createInstance (this.getApplicationContext()); utilizando un contenedor de contexto que solo contiene una referencia débil al contexto real.

En tal caso, usted delegaría todas las llamadas en el contexto débilmente referenciado que se borrará automáticamente cuando no haya otras referencias fuertes a él. Simplemente asegúrese de realizar una comprobación nula antes de acceder al contexto real de esta manera.

Context realContext = mMyWeakReference.get(); 
if (realContext != null) { 
    // delegate call to real context 
    realContext.delegateToWhateverFunctionWasCalled(); 
} 

almacenarlo en una variable local es importante y podría evitar una npe cuando se borre la referencia mientras se ejecuta el código.

Esto se ve como un posible problema de marco, aunque si el marco borra esta referencia un poco más tarde, también debería estar bien. Y en ese caso, puede que no sea un problema real, solo un falso positivo.

Cuestiones relacionadas