1

NullPointerException在 Android 2.3.4 中接到以下电话:

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调用失败,这不是我的代码。

我查看android.webkit.WebViewGrepCode 中的课程,但我无法弄清楚我是如何造成这种情况的。唯一的一行addPackageNames

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

所以,我得出的结论是mWebViewCoreor EventHubis null

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

4

2 回答 2

0

这肯定与mWebViewCore被设置为null.

mWebViewCore在 ViewView 的构造函数中实例化。唯一设置它的地方null是公共方法destroy()

webView.destroy()在代码中的任何地方调用吗?

于 2012-10-02T19:44:47.993 回答
0

在我看来,您的问题是调用 myMethod 时尚未实例化外部类。这里有点有趣的是,在您的情况下似乎破坏的内部代码不再存在于 Android 4.0 源代码中 - 因此您的问题可能不会出现在该版本的 Android 上。对我来说,这也表明之前版本的 Android Webview 存在一些问题,也许您遇到了 Android 问题。但这只是猜测,我的经验通常是我做错了,而不是 Android 团队:)

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

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

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

于 2012-10-04T12:41:39.477 回答