Android - 浏览器框架中的NPE

问题描述:

我偶尔会遇到用户触发的异常,我无法重现。由于它是从Looper发出的,我认为它是Handler类型回调的结果。我在Google代码上找到了similar bug,但将解决方案放入代码并未解决问题。问题是,在这条线的code in BrowserFrameAndroid - 浏览器框架中的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声明失败,并且从未执行过违规代码