我在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);
}
所以,我得出的结论是mWebViewCore
或EventHub
是null
。
任何Android专家都可以对此有所了解吗?这是一个已知的错误?我引起了这个吗?如果是这样,怎么样?如果没有,我该如何防止这种情况?
答案 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);
}
这不是一个漂亮的解决方案,但如果它有效,我认为它不会破坏任何东西。