2011-10-18 2 views
8

J'ai utilisé l'outil MAT dans Eclipse pour étudier un problème de fuite de mémoire et constaté que, parfois, une instance de thread CookieSyncManager perdait mon activité. Le chemin de mon activité à la racine de GC est la suivante:Une fuite de mémoire (fuite d'activité) provoquée par 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 appelé CookieSyncManager.createInstance (this.getApplicationContext()); dans onCreate(), mais il n'utilise pas de webview. Il contient seulement quelques animations. Je ne comprends pas pourquoi il est divulgué par CookieSyncManager. Quelqu'un peut-il aider?

Merci.

+0

un webview ...? – Blackbelt

+0

Pas de webview. CookieSyncManager est utilisé par une autre activité, mais pas cette activité. – Kai

+0

J'abandonne .. désolé – Blackbelt

Répondre

1

Vous pouvez appeler CookieSyncManager.createInstance (this.getApplicationContext()); utiliser un wrapper de contexte qui ne contient qu'une référence faible au contexte réel.

Dans un tel cas, vous devez déléguer tous les appels au contexte faiblement référencé qui sera automatiquement effacé lorsqu'il n'y aura pas d'autres références fortes. Assurez-vous juste d'effectuer une vérification nulle avant d'accéder au contexte actuel comme ceci.

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

stocker dans une variable locale est importante et elle permettra d'éviter NPE lorsque la référence est effacé pendant que votre code est exécuté.

Cela ressemble à un problème de structure potentiel, mais si le framework supprime cette référence un peu plus tard, il devrait également être bon. Et dans ce cas, ce n'est peut-être pas un vrai problème, juste un faux positif.