2009-11-19 2 views
0

가끔씩 사용자가 재생할 수없는 예외가 발생합니다. 루퍼에서 발행되었으므로 핸들러 유형 콜백의 결과라고 생각합니다. Google 코드에서 similar bug을 발견했지만 해결 방법을 찾지 못했습니다. 내가 mCallbackProxy가 null의 가정 때문에Android - BrowserFrame의 NPE

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

이 예외를 throw

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합니다 : 문제는 code in BrowserFrame이 라인에있다? 이 버그를 해결하려면 어떻게해야합니까?

답변

2

그래서이 문제를 조사하는데 약간의 시간을 투자했습니다. 이 오류는 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은 어떤 이유로 CallbackProxy 매개 변수에 null을 얻을 수 BrowserFrame 생성자에 설정되어있는 유일한 장소에서. 이 코드를 잡으려고 시도 할 수 없기 때문에 (Looper에서 호출 됨)이 오류를 처리 할 수있는 유일한 방법은 내 코드에서 WebView을 초기화 할 때 WebSettings#setSavePassword(false)으로 설정하는 것입니다. 이 경우 IF 문이 실패하고 코드가 실행되지 않습니다.

관련 문제