2009-11-19 3 views
0

Cette exception est parfois déclenchée par les utilisateurs que je ne peux pas reproduire. Comme il est issu de looper, je suppose que c'est le résultat d'un callback de type Handler. J'ai trouvé similar bug sur Google code, mais en mettant la solution dans le code ne l'a pas résolu. Le problème est à cette ligne de code in BrowserFrame:Android - NPE dans BrowserFrame

WebAddress uri = new WebAddress(
    mCallbackProxy.getBackForwardList().getCurrentItem() 
    .getUrl()); 

Ce qui jette cette exception parce que je suppose que mCallbackProxy est nul

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) 

Et les questions sont - ce sera forclose l'application? Et comment puis-je contourner ce bug?

Répondre

2

J'ai donc investi du temps dans l'étude de ce problème. L'erreur vient de ce code dans 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; 
     } 

Plus précisément de cette ligne

WebAddress uri = new WebAddress(
         mCallbackProxy.getBackForwardList().getCurrentItem() 

Le seul endroit où mCallbackProxy réglé est dans BrowserFrame constructeur qui obtient nulle pour CallbackProxy paramètre pour une raison quelconque. Comme je ne peux pas essayer/attraper ce code (il est appelé de Looper) la seule façon dont je peux traiter cette erreur est de définir WebSettings#setSavePassword(false) lorsque j'initialise WebView dans mon code. Dans ce cas, l'instruction IF échoue et le code incriminé n'est jamais exécuté