2011-05-26 16 views
5

tengo una pregunta: ¿NullPointerException en WebView (WebView.requestFocus())

En mi aplicación para Android no es una actividad que contiene un WebView. Este WebView contiene contenido Flash que se reproduce. Cuando cambio de esta aplicación a mi pantalla de inicio, el contenido de Flash se ejecuta sin problemas en el fondo. Cuando cambio a la pantalla de inicio y luego apago la pantalla, el contenido de Flash también se está ejecutando. Pero cuando apago la pantalla, mientras estoy en la aplicación, el WebView arroja un NullPointerException como el siguiente al final del texto. Realmente no tengo ni idea de cómo solucionar este problema. Espero que alguien pueda ayudarme.

Edición: Desarrollo para Android 2.2. Después de algunas pruebas, encontré algo especial. Cuando apago la pantalla mientras uso la aplicación obtengo la excepción mencionada, pero cuando enciendo la pantalla nuevamente a tiempo, obtengo "solo" la siguiente excepción. Sé que no es nada especial y que ya se sabe, pero tal vez sea útil.

05-27 07:46:10.067: ERROR/AndroidRuntime(8064): FATAL EXCEPTION: main 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064): java.lang.NullPointerException 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.webkit.WebView.requestFocus(WebView.java:6737) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1085) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewGroup.requestFocus(ViewGroup.java:1041) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1085) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewGroup.requestFocus(ViewGroup.java:1041) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewGroup.onRequestFocusInDescendants(ViewGroup.java:1085) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewGroup.requestFocus(ViewGroup.java:1044) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.View.requestFocus(View.java:3671) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1224) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1870) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.os.Looper.loop(Looper.java:130) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at android.app.ActivityThread.main(ActivityThread.java:3694) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-27 07:46:10.067: ERROR/AndroidRuntime(8064):  at dalvik.system.NativeStart.main(Native Method) 

Y aquí es el método donde se crea el WebView:

protected void onCreate(Bundle savedInstanceState){ 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setContentView(R.layout.externalplayer); 

    final Intent j = this.getIntent(); 

    webview = (WebView)findViewById(R.id.webview); 
    webview.getSettings().setJavaScriptEnabled(true); 
    webview.getSettings().setAllowFileAccess(true); 
    webview.getSettings().setPluginsEnabled(true); 
    webview.freeMemory(); 
    webview.setPictureListener(new picListener()); 

    webview.setWebViewClient(new WebViewClient(){ 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url){ 
      return true; 
     } 
    }); 

    if(Controller.unbuggedStart == true){ 
     Controller.unbuggedStart = false; 
     webview.destroy(); 
    } else{ 
     Controller.unbuggedStart = true; 
     d = ProgressDialog.show(externalPlayer.this, "Loading...", "Wait a moment..."); 
     webview.loadUrl(j.getCharSequenceExtra("link").toString()); 
    } 
} 


05-26 20:13:29.825: ERROR/AndroidRuntime(4754): FATAL EXCEPTION: main 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754): java.lang.RuntimeException: Unable to start activity ComponentInfo{xxxApp}: java.lang.NullPointerException 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1655) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1671) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2840) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread.access$1600(ActivityThread.java:117) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:935) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.os.Handler.dispatchMessage(Handler.java:99) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.os.Looper.loop(Looper.java:130) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread.main(ActivityThread.java:3694) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at dalvik.system.NativeStart.main(Native Method) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754): Caused by: java.lang.NullPointerException 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.webkit.WebView.requestFocus(WebView.java:6737) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.view.View.requestFocus(View.java:3671) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.view.View.requestFocus(View.java:3649) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at com.android.internal.policy.impl.PhoneWindow.restoreHierarchyState(PhoneWindow.java:1497) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.Activity.onRestoreInstanceState(Activity.java:844) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.Activity.performRestoreInstanceState(Activity.java:816) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.Instrumentation.callActivityOnRestoreInstanceState(Instrumentation.java:1096) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1633) 
05-26 20:13:29.825: ERROR/AndroidRuntime(4754):  ... 12 more 
+0

¿Puedes poner la parte del código cuando obtienes y cargar datos en tu webView? – Houcine

+0

gracias, he actualizado la primera publicación. – Letdoch

Respuesta

4

Bien chicos, he resuelto este problema.

La clave de la solución fue la orientación de la pantalla. Como puede ver en el código de la primera publicación, llamé al método onCreate(): setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

El resultado de esta llamada fue que la actividad se llamó dos veces debido al cambio de orientación. Esa es la razón por la que he utilizado:

if(Controller.unbuggedStart == true){ 
     Controller.unbuggedStart = false; 
     webview.destroy(); 
    } else{ 
     Controller.unbuggedStart = true; 
     d = ProgressDialog.show(externalPlayer.this, "Loading...", "Wait a moment..."); 
     webview.loadUrl(j.getCharSequenceExtra("link").toString()); 
    } 

Este código impide que el WebView para ser iniciado en dos ocasiones. Puedes ver que destruyo una de las dos WebViews creadas. Ahora, cuando apagué la pantalla, el sistema operativo desea llamar al WebView destruido que conduce al NullPointerException.

Sobrehougt los mecanismos de mi método onCreate y lo cambié. Ahora, la orientación se describe en el manifiesto:

android:screenOrientation="landscape" 

Después de esta modificación, el problema no se resolvió definitivamente. Cuando apagué la pantalla, el sistema operativo inició nuevamente la Actividad con el WebView, porque la orientación cambió de Horizontal a Vertical cuando apagué la pantalla.Agregué en el Manifiesto lo siguiente:

android:configChanges="keyboardHidden|orientation" 

y ahora todo funciona perfectamente.

0

Sin conocer la versión de Android que se está ejecutando, di un vistazo a la implementación de requestFocus() en el head revision de WebView y no parece haber tantas oportunidades para un NPE. Una posibilidad es que cuando se apaga la pantalla, se llama al método WebView.destroy() (lo que hace que mWebViewCore sea nulo), aunque la actividad aún se mantenga y se intente enfocar cuando se está usando el estado. restaurado

Puede intentar reemplazar OverRestoreInstanceState en su actividad y ver si la WebView todavía tiene un estado coherente en ese punto. Una vez más, mirando la revisión del encabezado, si llamaras a "getSettings()", esto arrojará un NPE por la misma razón y podrías estar relativamente seguro de que este es el problema.

+0

Te he intentado aconsejar, pero lamentablemente no cambia nada. He editado la primera publicación con nuevas informaciones nuevas. :) – Letdoch

+0

Como se puede ver en la fuente que agregué hacer la primera publicación, tengo un código para evitar que WebView se lance varias veces. No sé por qué, pero cuando llamo a la actividad externalPlayer se llamará dos veces y no encuentro otra manera de evitar eso. Cuando recomiendo este código (unbuggedStart) y apago la pantalla, la aplicación no se cuelga y el problema principal es fijo, pero tengo que manejar el doble inicio de WebView y no sé cómo. hmmm – Letdoch

Cuestiones relacionadas