2011-05-26 46 views
5

我有一个问题:的NullPointerException上的WebView(WebView.requestFocus())

在我的Android应用程序存在含有WebView的活动。此WebView包含播放的Flash内容。当我将这个应用程序切换到我的主屏幕时,Flash内容在后台运行平稳。当我切换到主屏幕并关闭屏幕时,Flash内容也在运行。但是当我关闭屏幕时,当我在应用程序本身中时,WebView在文本结尾处抛出如下所示的NullPointerException。我真的不知道如何解决这个问题。我希望有人能帮助我。

编辑:我开发Android 2.2。经过一些测试,我发现了一些特别的东西当我在运行应用程序时关闭屏幕时,出现提到的异常,但是当我及时打开屏幕时,我只能得到以下异常。我知道这没什么特别的,并且已经知道,但也许它有帮助。

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) 

这里是其中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

你可以把你的代码的一部分,当你得到和加载数据在你的webView? – Houcine 2011-05-26 22:01:59

+0

谢谢你,我已经更新了第一篇文章。 – Letdoch 2011-05-27 05:36:25

回答

4

好吧,我解决了这个问题。

解决方案的线索是屏幕方向。就像你可以在第一篇文章的代码中看到的那样,我在onCreate()方法中调用:setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

该调用的结果是,由于方向更改导致该活动被调用两次。这就是我使用的原因:

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()); 
    } 

此代码可以防止WebView被启动两次。你可以看到我销毁了两个创建的WebView中的一个。现在,当我关闭屏幕时,操作系统想要调用销毁的WebView,这导致NullPointerException

我推断了我的onCreate方法的机制并对其进行了更改。现在,清单中描述了方向:

android:screenOrientation="landscape" 

经过此修改后,问题并未得到解决。当我关闭屏幕时,操作系统再次启动了WebView的活动,因为当我关闭屏幕时方向从横向切换到纵向。我在清单中添加以下内容:

android:configChanges="keyboardHidden|orientation" 

现在一切完美的作品。

0

不知道你正在运行的是Android的版本,我看了看requestFocus的实施()在WebView的head revision,并且看起来没有那么多NPE的机会。一种可能性是当屏幕关闭时,WebView.destroy()方法正在被调用(将mWebViewCore设置为null),即使Activity仍然保留并且在状态为恢复。

您可能会尝试在您的Activity中覆盖onRestoreInstanceState,并查看WebView在该点是否仍然具有一致的状态。同样,看一下头部修订,如果你打电话给“getSettings()”,这将会抛出一个NPE出于同样的原因,你可以相对确定这是问题。

+0

我试过你的建议了,但可悲的是它没有改变某些东西。我已经编辑了第一篇文章,并提供了一些新的信息。 :) – Letdoch 2011-05-27 05:48:39

+0

正如你可以在源代码中看到的,我添加了第一篇文章,我有一些代码可以防止WebView获得倍增时间。我不知道为什么,但是当我调用externalPlayer的活动时,它会被调用两次,我没有找到另一种方法来避免这种情况。当我推荐这个代码(unbuggedStart)并关闭屏幕时,应用程序不会崩溃,主要问题已修复,但我必须处理WebView的双重启动,我不知道如何。嗯 – Letdoch 2011-05-27 06:02:29

相关问题