LeakCanary detecta pérdida de memoria de Android WebView

He estado usando la herramienta leakcanary para detectar fugas de memoria en mi aplicación. Parece que mi WebViewActivity se filtra cada vez.

Creé una aplicación simple para probar las fugas. Comienzo una actividad con un WebView dentro del archivo de disposición de xml / inflate con el contexto de la actividad. Js apagado. Todo lo predeterminado espera un simple webViewClient manteniendo la redirección dentro de WebView. Se filtra cada vez.

He hecho un montón de investigación, la única manera de evitar esto es iniciar WebViewActivity con otro proceso y matarlo dentro de destruir. Pero este método tiene sus propias desventajas.

La filtración ocurre siempre en todos mis dispositivos que funcionan 5.0+, no han comprobado con 4.3 y abajo.

La información de la fuga se pega a continuación:

En com.example.webviewmemoryleaktest: 1.0: 1. * Com.example.webviewmemoryleaktest.WebViewActivity se ha filtrado: * GC ROOT android.os.ResultReceiver $ MyResultReceiver.this $ 0 * referencias org.chromium.content.browser.ContentViewCore $ 2 $ 1.this $ 1 (la clase anónima extiende android.os.ResultReceiver) * Referencias org.chromium.content.browser.ContentViewCore $ 2.this $ 0 * referencias org.chromium.content.browser.ContentViewCore.mContext * referencias com.android.webview.chromium.ResourcesContextWrapperFactory $ WebViewContextWrapper.mBase * filtra con.example.webviewmemoryleaktest .WebViewActivity instancia

  • Clave de referencia: 9a0346cf-6ad9-4b07-9329-a975d8fa3cbe
  • Dispositivo: LGE google Nexus 4 occam
  • Versión de Android: 5.1 API: 22
  • Duraciones: reloj = 5139ms, gc = 188ms, descarga del montón = 2822ms, análisis = 30918ms

Apreciar si alguien podría ayudar. ¡Gracias!

 private ResultReceiver mResultReceiver = new ResultReceiver(new Handler()) { @Override public void onReceiveResult(int resultCode, Bundle resultData) { getContentViewClient().onImeStateChangeRequested( resultCode == InputMethodManager.RESULT_SHOWN || resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN); if (resultCode == InputMethodManager.RESULT_SHOWN) { // If OSK is newly shown, delay the form focus until // the onSizeChanged (in order to adjust relative to the // new size). // TODO(jdduke): We should not assume that onSizeChanged will // always be called, crbug.com/294908. getContainerView().getWindowVisibleDisplayFrame( mFocusPreOSKViewportRect); } else if (hasFocus() && resultCode == InputMethodManager.RESULT_UNCHANGED_SHOWN) { // If the OSK was already there, focus the form immediately. assert mWebContents != null; mWebContents.scrollFocusedEditableNodeIntoView(); } } }; @Override public ResultReceiver getNewShowKeyboardReceiver() { return mResultReceiver; } 

Hacer que mResultReceiver sea privado.

  • Cómo pasar un objeto Blob de javascript a Android?
  • Las imágenes se cargan más rápido en la vista web
  • Almacenamiento de un WebView para la navegación sin conexión
  • Cómo mostrar javascript popup en android webview
  • Almacenamiento en caché en la vista web de Android
  • Carga de archivos en WebView
  • ¿Puedo usar componentes de polímero / web en una aplicación androide nativa sin Cordova?
  • WebView no carga la página web
  • No vuelva a cargar el vídeo de la web en rotación
  • Cómo utilizar una fuente personalizada con WebView
  • android - obtener texto fuera de la vista web
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.