web-dev-qa-db-fra.com

Détruisez la vue Web dans Android

Impossible de détruire WebView

Tout d'abord, de nombreux exemples ont été essayés pour avoir détruit la vue Web dans Android.

Par exemple: fuite de mémoire dans Android

Bien que je détruisais la vue Web dans onDestroy () et que je déclarais une vue Web par programme, mais le problème de fuite de mémoire se produirait également sur mon appareil Android Android.

Ci-dessous est mon codage ..

public class MainActivity extends Activity {
private FrameLayout mWebContainer;
private WebView mWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    mWebContainer = (FrameLayout) findViewById(R.id.web_container);
    mWebView = new WebView(getApplicationContext());
    mWebContainer.addView(mWebView);
}

@Override
protected void onDestroy() {
    super.onDestroy();

    mWebContainer.removeAllViews();
    mWebView.clearHistory();
    mWebView.clearCache(true);
    mWebView.clearView();
    mWebView.destroy();
    mWebView = null;        
}

Quelqu'un m'aide s'il vous plait .. merci ..

27
user2477457

La WebView peut ne pas être détruite car vous supprimez la vue dans onDestroy (), qui peut être appelée à plusieurs reprises: lorsque l'utilisateur quitte l'application via le bouton de retour, lorsque l'utilisateur appuie sur le bouton d'accueil, puis fait glisser le l'application récente, ou lorsque le système tue votre application pour faire de la place à d'autres applications. Il peut être problématique de détruire le WebView dans onDestroy ().

Ancienne réponse: Pour supprimer le WebView de la mémoire, remplacez la méthode finish () et placez le code que vous avez dans onDestroy () dans finish (). finish est appelé lorsque l'application est fermée via le bouton de retour, ce qui garantit que la WebView est détruite.

Nouvelle réponse: Je me trompais à l'origine sur le moment où la méthode onDestroy a été appelée, donc moi et d'autres avons édité la question pour supprimer les parties qui étaient erronées. Cependant, cela modifie également légèrement ce que je ferais pour détruire le WebView. Il se peut qu'il n'y ait pas assez de temps pour détruire la WebView dans onDestroy, ou il se pourrait que l'activité soit détruite plusieurs fois , ce qui entraînerait le crash, car la WebView serait détruite plusieurs fois fois et cela le planterait (voir la citation de la documentation au bas de cette réponse). La solution consiste à être plus explicite lors de la destruction du WebView et également à définir le WebView sur null afin que vous puissiez être sûr qu'il n'a pas été détruit avant d'essayer de le détruire.

Lorsque vous utilisez WebView.destroy (), en interne, WebView se détruira, mais le problème est qu'il n'y a aucun moyen de déterminer si vous avez appelé destroy sur un objet WebView existant ou non. Cela pose problème, car l'appel de méthodes sur le WebView après sa destruction entraînera un plantage. La solution consiste à définir la WebView sur null après l'avoir détruite.

Votre code complet pour supprimer la vue devrait ressembler à ceci (certaines choses sont facultatives):

public void destroyWebView() {

    // Make sure you remove the WebView from its parent view before doing anything.
    mWebContainer.removeAllViews();

    mWebView.clearHistory();

    // NOTE: clears RAM cache, if you pass true, it will also clear the disk cache.
    // Probably not a great idea to pass true if you have other WebViews still alive.
    mWebView.clearCache(true);

    // Loading a blank page is optional, but will ensure that the WebView isn't doing anything when you destroy it.
    mWebView.loadUrl("about:blank");

    mWebView.onPause();
    mWebView.removeAllViews();
    mWebView.destroyDrawingCache();

    // NOTE: This pauses JavaScript execution for ALL WebViews, 
    // do not use if you have other WebViews still alive. 
    // If you create another WebView after calling this, 
    // make sure to call mWebView.resumeTimers().
    mWebView.pauseTimers();

    // NOTE: This can occasionally cause a segfault below API 17 (4.2)
    mWebView.destroy();

    // Null out the reference so that you don't end up re-using it.
    mWebView = null;
}

Cette méthode doit ensuite être appelée quelque part, de préférence dans finish () car elle sera explicitement appelée par l'utilisateur, mais elle devrait également fonctionner dans onDestroy ().

REMARQUE: je dois ajouter que l'appel de mWebView.onDestroy() deux fois peut bloquer le navigateur. Les documents indiquent:

Aucune autre méthode ne peut être appelée sur cette WebView après la destruction.

43
anthonycr