2012-09-07 23 views
6

Cada pocos días obtengo un informe de fallos para mi aplicación con el siguiente seguimiento de pila, o pequeñas variantes del mismo (con diferentes números de línea basados ​​en diferentes versiones de Android)

java.lang.NullPointerException at 
WebView.java:8241:in `android.webkit.WebView$PrivateHandler.handleMessage' 
Handler.java:99:in `android.os.Handler.dispatchMessage' 
Looper.java:150:in `android.os.Looper.loop' 
ActivityThread.java:4293:in `android.app.ActivityThread.main' 
Method.java:-2:in `java.lang.reflect.Method.invokeNative' 
Method.java:507:in `java.lang.reflect.Method.invoke' 
ZygoteInit.java:849:in `com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run' 
ZygoteInit.java:607:in `com.android.internal.os.ZygoteInit.main' 
NativeStart.java:-2:in `dalvik.system.NativeStart.main' 

Esta pila específica estaba en Android 2.3.4 en un dispositivo HTC EVO 3D PG86100. Mi aplicación aloja varias vistas web para algunos escenarios de inicio de sesión relacionados con OAuth.

¿Cómo debo tratar de averiguar cómo solucionarlo? Intenté buscar en grepcode para encontrar la fuente, pero no puedo encontrar un número de línea coincidente que tenga sentido. Es mi Grepcode-fu débil?

+0

¿Algún patrón para los lanzamientos de Android o fabricantes de dispositivos? – CommonsWare

+0

¡Interesante observación! ¡Parece estar confinado a dispositivos HTC! – PacificSky

+0

He agregado la etiqueta HTC, ya que existe la posibilidad de que reciba asistencia de HTC. Supongo que no tiene un caso de prueba reproducible, ¿correcto? – CommonsWare

Respuesta

5

Me encontré con este problema recientemente y en mi caso me las arreglé para descubrir que una corrección secundaria de errores estaba causando este problema.

Por lo tanto, si no creó una clase personalizada que extienda la vista web, eso anula onCheckIsTextEditor para que siempre devuelva verdadero debido a una sugerencia en este android bug report ... Dejaría de leer aquí.

Si lo ha hecho, parece que esta solución ya ha sido implementada por HTC y por algún motivo hace que se bloquee cuando recibe el foco. Este problema se manifestó en dos lugares para mí, al colocar eventos táctiles en la vista y al establecer la visibilidad de las vistas. En mi proyecto, establecí un WebViewClient y esperé hasta que la página terminara de cargar antes de configurar la visibilidad de la vista web como visible. Esto hizo que el seguimiento de pila:

java.lang.NullPointerException at android.webkit.WebView.navHandledKey(WebView.java:9353) 
    at android.webkit.WebView.requestFocus(WebView.java:7910) 
    at android.view.View.requestFocus(View.java:3718) 
    at android.view.View.requestFocus(View.java:3696) 
    at android.view.ViewRoot.focusableViewAvailable(ViewRoot.java:1803) 
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474) 
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474) 
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474) 
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474) 
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474) 
    at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:474) 
    at android.view.View.setFlags(View.java:4680) 
    at android.view.View.setVisibility(View.java:3163) 

Al envolver la llamada setVisibility en un try/catch yo era capaz de determinar si debería anular los eventos de toque o no. Si cogí el evento, eso significaría que debería desactivar la anulación. Este es un ejemplo de lo que hice:

try { 
    webView.setVisibility(View.VISIBLE); 
} catch (NullPointerException e) { 
    Log.i(TAG, "Error setting webview visibility due to overriding focus. It will be disabled."); 
    webView.setOverrideOnCheckIsTextEditor(false); 
    // Confirm window is visible 
    webView.setVisibility(View.VISIBLE); 
} 

Mi vista web personalizada ahora se ve así, especial atención a los dos últimos métodos:

/** 
* When using a webview in a dialog, there are issues relating to the keyboard not appearing when focusing on a text box. 
* This overrides a function to ensure the keyboard is shown when focusing on a text box in a webview. 
* See link for bug report and solution. 
* 
* @see http://code.google.com/p/android/issues/detail?id=7189 
* @see http://stackoverflow.com/questions/12325720 
* @author James O'Brien 
* @since 10/16/2012 
*/ 
public class FocusableWebView extends WebView { 

    private boolean mOverrideCheckIsTextEditor = true; 

    /** 
    * Default Constructor 
    * 
    * @param context 
    */ 
    public FocusableWebView(Context context) { 
     super(context); 
    } 

    /** 
    * Default Constructor 
    * 
    * @param context 
    * @param attrs 
    */ 
    public FocusableWebView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    /** 
    * Default Constructor 
    * 
    * @param context 
    * @param attrs 
    * @param defStyle 
    */ 
    public FocusableWebView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onCheckIsTextEditor() { 
     if (mOverrideCheckIsTextEditor) { 
      return true; 
     } else { 
      return super.onCheckIsTextEditor(); 
     } 
    } 

    /** 
    * Enable/Disable overriding of onCheckIsTextEditor to always return true. 
    */ 
    public void setOverrideOnCheckIsTextEditor(boolean foo) { 
     mOverrideCheckIsTextEditor = foo; 
    } 
} 

Lo siento, no puedo entrar en más detalles acerca por qué esto soluciona el problema Todo lo que puedo suponer es que su relación con el enfoque y la desactivación de forma dinámica funciona una delicia :)

** Actualización (12/11/12) **

logrado resolver ambos problemas presentados anteriormente. Parecía ser un problema con el enfoque de la vista web. Mi código se verá así

webView.setVisibility(View.VISIBLE); 
webView.setFocusable(true); 
webView.requestFocus(); 

Yo sugeriría asegurándose de que se establezca explícitamente el atributo enfocable a 'verdadero' o llamando setFocusable (verdadero).

+0

Creo que su solución es para un problema ligeramente diferente de la pregunta original. He visto el bloqueo que estás viendo (en navHandledKey), así que creo que tu solución podría solucionar ese bloqueo. Sin embargo, no estoy seguro de que corrija el seguimiento de la pila original que publiqué (bloqueo en PrivateHandler.handleMessage). ¿Puedes confirmar que has visto ese bloqueo en tu aplicación y que se ha ido después de tu solución? – PacificSky

+0

Tenía un seguimiento de pila idéntico en teléfonos con versiones similares de HTC y descubrí que al desactivar la anulación de foco se solucionó el problema. Entiendo, y lo anoté en el segundo párrafo, que mi solución es bastante específica, pero espero que señalar que estaba relacionada con la visión web ganar enfoque será de alguna ayuda. – jimmithy

+0

Gracias. Implementé tu solución. Si no vuelvo a ver los mismos bloqueos, lo marcaré como la respuesta. – PacificSky

Cuestiones relacionadas