Android - 浏览器框架中的NPE
问题描述:
我偶尔会遇到用户触发的异常,我无法重现。由于它是从Looper发出的,我认为它是Handler类型回调的结果。我在Google代码上找到了similar bug,但将解决方案放入代码并未解决问题。问题是,在这条线的code in BrowserFrame:Android - 浏览器框架中的NPE
WebAddress uri = new WebAddress(
mCallbackProxy.getBackForwardList().getCurrentItem()
.getUrl());
会抛出该异常是因为我想mCallbackProxy是空
java.lang.NullPointerException
at android.webkit.BrowserFrame.handleMessage(BrowserFrame.java:348)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:471)
at java.lang.Thread.run(Thread.java:1060)
而问题是 - 将在forclose应用程序?我该如何解决这个bug?
答
所以我投入了一些时间来研究这个问题。这个错误来自这个代码BrowserFrame:
case FRAME_COMPLETED: {
if (mSettings.getSavePassword() && hasPasswordField()) {
if (WebView.DEBUG) {
Assert.assertNotNull(mCallbackProxy.getBackForwardList()
.getCurrentItem());
}
WebAddress uri = new WebAddress(
mCallbackProxy.getBackForwardList().getCurrentItem()
.getUrl());
String schemePlusHost = uri.mScheme + uri.mHost;
String[] up = mDatabase.getUsernamePassword(schemePlusHost);
if (up != null && up[0] != null) {
setUsernamePassword(up[0], up[1]);
}
}
CacheManager.trimCacheIfNeeded();
break;
}
专门从这一行
WebAddress uri = new WebAddress(
mCallbackProxy.getBackForwardList().getCurrentItem()
其中mCallbackProxy设置为BrowserFrame
构造函数得到空了CallbackProxy
参数无论出于何种原因的唯一地方。由于我无法尝试/捕获此代码(它是从Looper调用的),所以我可以处理此错误的唯一方法是在我的代码中初始化WebView
时设置WebSettings#setSavePassword(false)
。在这种情况下,IF
声明失败,并且从未执行过违规代码