2011-03-11 10 views
6

Como se ha mencionado en esta pregunta sin respuesta: WebView throws Receiver not registered: android.widget.ZoomButtonsControllerCómo activar de manera segura vista web zoom dentro y fuera según sea necesario

Al girar los controles vista web zoom dentro y fuera según sea necesario tiros esto:

java.lang.IllegalArgumentException: Receiver not registered: android.widget.ZoomButtonsController 

Para algunos usuarios . Yo mismo no he visto este accidente, pero lo he visto en los registros que provienen de dispositivos en la naturaleza. No sucede súper frecuentemente, pero es un accidente independientemente. ¿Algunas ideas?

Gracias

Actualización: Cómo reproducir

encontré cómo reproducir este accidente: http://code.google.com/p/android/issues/detail?id=15694

Voy a informar si descubro una solución.


Conforme a lo solicitado, el pleno seguimiento de la pila:

java.lang.IllegalArgumentException: Receiver not registered: [email protected] 
at android.app.ActivityThread$PackageInfo.forgetReceiverDispatcher(ActivityThread.java:793) 
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:913) 
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:331) 
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:404) 
at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
at dalvik.system.NativeStart.main(Native Method) 

y otro similar:

java.lang.IllegalArgumentException: View not attached to window manager 
at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:391) 
at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:236) 
at android.view.Window$LocalWindowManager.removeView(Window.java:432) 
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:406) 
at android.widget.ZoomButtonsController$2.handleMessage(ZoomButtonsController.java:178) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:143) 
at android.app.ActivityThread.main(ActivityThread.java:5068) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 
+0

¿Puedo tiene la pila completa @littleFluffyKitty accidente? – Reno

+0

@Reno oh hai! ¡Seguro que puedes hacerlo! – cottonBallPaws

+0

algún código sería útil – the100rabh

Respuesta

8

en un Xoom me encontré con que si uno espera para el control de zoom a desaparecer antes de llamar WebView.destroy() un accidente ya no se produce. Así que he sobrescrito WebView.destroy() para publicar un mensaje en un controlador para llamar a WebView.destroy() después de unos segundos. De fuente WebView vemos el intervalo de fundido de salida es:

// The time that the Zoom Controls are visible before fading away 
private static final long ZOOM_CONTROLS_TIMEOUT = 
     ViewConfiguration.getZoomControlsTimeout(); 

por lo que utiliza ViewConfiguration.getZoomControlsTimeout() + 1000L como el retardo antes de llamar WebView del método destroy. Hasta el momento no se bloquea.

+0

Esta es la solución que parece funcionar en torno al error –

0

java.lang.IllegalArgumentException: Vista sin unido a gestor de ventanas la excepción se produce principalmente cuando hay un diálogo (es decir, diálogo de progreso) y lo descarta cuando el A La actividad se ha cerrado. ¿Podría decirme si su Actividad tiene un cuadro de diálogo de progreso en ella, para que pueda continuar con mi análisis? También publique el fragmento de código de su Actividad que podría ayudarnos a identificar por qué se bloquea su aplicación ...

También dice que no se enfrenta a fallos de la aplicación con frecuencia, por lo que haga una prueba para confirmar mis sospechas. Cuando la aplicación se está ejecutando, cambie la orientación de la pantalla y repítalo un par de veces, luego de algunos minutos, preferiblemente cuando haya un Diálogo de progreso involucrado en algún trabajo. Podría bloquear la aplicación, lo que debería indicarnos que el error se debe a que el Diálogo de progreso no se está descartando correctamente.

Mi teoría: cuando cambie de orientación, Android creará una nueva Vista. Probablemente estés bloqueado porque tu hilo de fondo está intentando cambiar el estado en el anterior. (Puede también estar teniendo problemas porque el hilo de fondo no está en el hilo de interfaz de usuario)

+0

Creo que explica sobre la excepción de WindowBadToken. Pero aquí está el caso diferente – Sameer

0

que tienen el mismo problema aquí: Existent app blowing up with android 3.0 XOOM. ZoomButtonsController Leak?

Esto sucede cuando hay una excepción que ocurre antes de registerReceiver se llama y luego intenta anular el registro de Receiver más tarde sin que se haya registrado.

Probablemente sea un error de Android 3.0.

+0

En cuanto a los registros de errores , También he visto esto suceder con dispositivos pre 3.0. – cottonBallPaws

+0

Según [this] (http://code.google.com/p/android/issues/detail?id=6191) puede que se haya solucionado en honeycomb o_O " – Reno

+0

no es el mismo error ... –

2

Si va a tropezar con esta pregunta, asegúrese de revisar el informe de error primero para ver cuál es el estado de Google, pero por lo demás aquí es una solución que se trabaja hasta ahora tan bueno para mí:

Agregar esta línea a su método onDestory():

webView.getSettings().setBuiltInZoomControls(true); 
+0

No funciona en Android 4.03, todavía se bloquea! –

+0

Esta solución no resuelve el problema por completo. Pruebe el método de dkneller. – cottonBallPaws

8

Si sólo desea tener zoom pizca trabajar con su vista web y se puede vivir sin los botones de zoom, se puede hacer esto a su vista web:

webView.getSettings().setBuiltInZoomControls(true); // will give pinch zoom 
webView.getSettings().setDisplayZoomControls(false); // but won't display the zoom buttons 

añadiendo

webView.getSettings().setBuiltInZoomControls(true); 

en OnDestroy/onDestroyView no ayudó en 3.x.

7

webView.getSettings(). SetBuiltInZoomControls (true); no funcionó para mí sugerencia

de dkneller hizo el trabajo, sin embargo:

long timeout = ViewConfiguration.getZoomControlsTimeout(); 
    new Timer().schedule(new TimerTask() { 
     @Override 
     public void run() { 
      webview.destroy(); 
     } 
    }, timeout); 
+0

Accidente en algunos dispositivos (4.X 5.X 6.X todos informó) con la respuesta anterior, ** java.lang.Throwable: se llamó a un método WebView en el hilo 'Timer-0'.Todos los métodos WebView deben invocarse en el mismo hilo. (Looper Looper esperado (principal, tid 1) {4240c348} llamado en nulo, FYI principal Looper es Looper (principal, tid 1) ** – droida

5

Deja esta línea en OnDestroy funciona para mí:

webView.setVisibility(View.GONE);

2

Esta solución funciona bien, sólo hay que quitar la vista web de la diseño antes de destruirlo:

@Override 
    public void onDestroy() { 
     if (webView!=null && webView.getParent()!=null){ 
      ((ViewGroup)webView.getParent()).removeView(webView); 
      webView.destroy(); 
      webView=null; 
     } 
     super.onDestroy(); 
    } 

No hay manipuladores, no hay retrasos, creo que es la mejor solución

0

Agregue esto a su actividad:

@Override 
    public void finish() { 
     ViewGroup view = (ViewGroup) getWindow().getDecorView(); 
     view.removeAllViews(); 
     super.finish(); 
} 
Cuestiones relacionadas