2011-03-14 3 views
2

Désolé s'il s'agit d'une sorte de question en double. J'ai googlé pendant environ une heure mais j'ai toujours des problèmes avec l'utilisation de la mémoire du composant WebView.Fuite de mémoire WebView

Je commence une activité (NewsDetail) à partir d'un ListActivity pour afficher un article de nouvelles spécifique. Le code HTML de l'article est ajouté au WebView qui est inclus dans la mise en page de l'activité. (Il charge également 1 ou 2 images par newsDetail.loadDataWithBaseURL())

Je commence l'article Activité via:

Intent i = new Intent(getApplicationContext(), NewsDetail.class); 
i.putExtra("position", position); 
startActivity(i); 

Après avoir lu this question, j'ai changé la mise en page afin que j'ajouter la WebView programme:

newsDetail = new WebView(getApplicationContext()); 

Dans ma méthode de OnDestroy est défini:

public void onDestroy(){ 
    super.onDestroy(); 
    newsDetail.destroy(); 
    newsDetail = null; 
    finish(); 
    System.gc(); 
} 

Après un certain temps, le garbage collector réduit la quantité de mémoire d'environ 4 Mo à 2 Mo. Si j'ouvre/ferme plusieurs articles de nouvelles, il atteint une taille de tas critique. Comme mentionné précédemment, après avoir détruit l'activité, il reste 2 Mo à l'activité (ce qui n'existe pas si je supprime complètement le WebView du code). Il semble donc que cela ait un rapport avec le WebView lui-même. Le même problème is mentioned here.

J'ai aussi mis:

android:noHistory="true" 

Quelqu'un at-vous une idée de comment se débarrasser complètement de l'utilisation de la mémoire de l'activité « Détails des Nouvelles » après son retour à mon ListActivity? Serait heureux d'entendre des idées, cela me rend fou. Existe-t-il un graphique pour les téléphones Android offrant une taille de segment de mémoire de plus de 16 Mo?

Répondre

1

Il y a une référence mParent qui pointe vers le ViewGroup qui contient WebView et éventuellement à votre Activité. WebView laisse échapper tout ce qu'il peut trouver, vous devez donc le retirer de la hiérarchie de la vue.

Voir ma réponse ici:

Memory leak in WebView

0

Si votre onDestroy se trouve dans l'activité newsDetail, il est genre de code bizarre. D'abord vous faites super.onDestroy() qui devrait faire ce que vous voulez afin que l'objet soit marqué pour GC. Mais dans la ligne après avoir référencé le même objet. Je ne suis pas un expert mais cela pourrait causer des problèmes.

Si la méthode onDestroy est à l'intérieur de votre listActivity, il est logique que cela ne fonctionne pas parce que la méthode est jamais appelée que les listActivity reste ouvert alors que d'autres newsDetails sont ouvertes.