Android WebView中的NPE

时间:2012-09-21 05:40:46

标签: android webkit android-2.3-gingerbread

我在Android 2.3.4中的以下调用中获得NullPointerException

java.lang.NullPointerException
    at android.webkit.WebView.addPackageNames(WebView.java:4063)
    at com.my.company.MyClass$MyInnerClass.myMethod(MyClass.java:283)
    at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
    at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
    at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:246)
    at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1981)
    at android.webkit.WebViewCore.access$1400(WebViewCore.java:53)
    at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:1122)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:674)
    at java.lang.Thread.run(Thread.java:1019)

MyClass $ MyInnerClass作为

添加到JavaScript界面
class MyClass {
    // ...
        myWebView.addJavascriptInterface(new MyInnerClass(), "MyInnerClass");
    // ...

    public void myOuterMethod(int param1, int param2) {
        // Notify a listener that myOuterMethod was called
    }

    private class MyInnerClass {
        public void myMethod(int param1, int param2) {
            myOuterMethod(param1, param2);
        }
    }
}

因此,JavaScript调用MyInnerClass.myMethod(-1, -1)似乎很好地通过Java-JavaScript桥接,但addPackageNames调用失败,这不是我的代码。

我看过the android.webkit.WebView class in GrepCode,但我无法弄清楚我是如何造成这种情况的。 addPackageNames中唯一的一行是

public void addPackageNames(Set<String> packageNames) { 
    mWebViewCore.sendMessage(EventHub.ADD_PACKAGE_NAMES, packageNames);
}

所以,我得出的结论是mWebViewCoreEventHubnull

任何Android专家都可以对此有所了解吗?这是一个已知的错误?我引起了这个吗?如果是这样,怎么样?如果没有,我该如何防止这种情况?

2 个答案:

答案 0 :(得分:0)

这与mWebViewCore设置为null有关。

mWebViewCore在ViewView的构造函数中实例化。并且将其设置为null的唯一位置是公共方法destroy()

您是否在代码中的任何位置致电webView.destroy()

答案 1 :(得分:0)

在我看来,你的问题是当你的myMethod被调用时,外部类还没有被实例化。这里有点有趣的是,在你的情况下似乎破解的内部代码不再存在于Android 4.0源代码中 - 所以你的问题可能不会发生在那个版本的Android上。对我来说,这也表明以前版本的Android Webview存在一些问题,也许您遇到了Android问题。但这只是猜测,我的经验通常是我做错了,而不是Android团队:)

可能的解决方案是将代码包装在if语句中:

if(MyClass.this != null) {
    myOuterMethod(param1, param2);
}

这不是一个漂亮的解决方案,但如果它有效,我认为它不会破坏任何东西。