2012-02-07 21 views
6

Así que seguí un puesto en evitar pérdidas de memoria WebView, lo que sugiere utilizar un contenedor vistas web y luego añadir programación/quitar la vista web desde el recipiente en códigos de actividad: Memory leak in WebViewAndroid BadTokenException cuando se utiliza una vista Web Container

Sin embargo , llegué a la siguiente accidente al hacer clic en un elemento hTML que impulsa a una lista de opciones para seleccionar, (por ejemplo, fecha/Mes menú desplegable)

W/dalvikvm(17767): threadid=1: thread exiting with uncaught exception (group=0x4001d5a0) 
W/WindowManager(129): Attempted to add window with non-application token WindowToken{4094b730 token=null}. Aborting. 
FATAL EXCEPTION: main 
android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application 
android.view.ViewRoot.setView(ViewRoot.java:561) 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177) 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
android.app.Dialog.show(Dialog.java:265) 
android.webkit.WebView$InvokeListBox.run(WebView.java:9170) 
android.os.Handler.handleCallback(Handler.java:587) 
android.os.Handler.dispatchMessage(Handler.java:92) 
android.os.Looper.loop(Looper.java:150) 
android.app.ActivityThread.main(ActivityThread.java:4263) 
java.lang.reflect.Method.invokeNative(Native Method) 
java.lang.reflect.Method.invoke(Method.java:507) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
dalvik.system.NativeStart.main(Native Method) 

tengo el siguiente en mi diseño:

FrameLayout 
    android:id="@+id/webview_container" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_below="@+id/titlebar"> 
/FrameLayout> 

I tienen la siguiente en onCreate():

mWebViewContainer = (FrameLayout)findViewById(R.id.webview_container); 
mWebView   = new WebView(getApplicationContext()); 
mWebViewContainer.addView(mWebView); 

mWebView.setWebChromeClient(new WebChromeClient()); 

también puse un WebViewClient.

He verificado que mWebView.getWindowToken() devuelve un valor no nulo.

¿Alguna idea de por qué podría estar pasando este problema?

Edit: He hecho algo más de experimentar y mirar alrededor, pero todavía no he resuelto este problema. Todo funciona bien si coloco la vista web directamente en el diseño mismo. Pero no quiero hacer eso porque quiero ser capaz de intercambiar opiniones de la web de manera dinámica.

+1

todavía se presenta el error si se reemplaza "getApplicationContext()" por "presente" cuando se crea el WebView? –

Respuesta

9

Cuando crea el WebView, actualmente utiliza el contexto de la aplicación. Debe usar el contexto de la Actividad. Para resolver el problema, reemplace getApplicationContext() con this cuando cree WebView.

+0

¿No debería ser este el comentario? Creo que tienes reputación para agregar comentarios. Muévete para comentar antes de que alguien vote. – kosa

+0

cierto, cierto. Editó la respuesta porque creo que esto podría resolver el problema. –

+0

Desafortunadamente eso no soluciona el problema. El mismo bloqueo ocurre incluso cuando se usa "this" –

13

El problema es aquí:

mWebView.setWebChromeClient(new WebChromeClient()); 

después de haber dejado la actividad, hay posibilidades de que algunas devoluciones de llamada en WebChromeClient intentará abrir diálogos durante la actividad contenedor ha sido destruida.
Aquí es una solución que funciona para mí, sólo tiene que añadir mWebView.destroy() en OnDestroy de su actividad()

@Override 
    public void onDestroy() { 
     super.onDestroy(); 
     if (mWebView != null) 
      mWebView.destroy(); 
    } 
Cuestiones relacionadas