0

ユーザーによって時折発生するこの例外が発生し、再現できません。looper から発行されているので、Handler 型のコールバックの結果だと思います。Googleコードで同様のバグを見つけましたが、ソリューションをコードに入れても解決しませんでした. 問題はBrowserFrame の次のコード行にあります。

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

mCallbackProxy が null であると想定しているため、この例外がスローされます

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)

問題は、これでアプリを閉じることができるかどうかです。また、このバグを回避するにはどうすればよいですか?

4

1 に答える 1

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 が設定される唯一の場所は、何らかの理由でパラメーターに対してBrowserFramenull を取得するコンストラクターです。CallbackProxyこのコードを試行/キャッチできないため (ルーパーから呼び出されます)、このエラーに対処できる唯一の方法は、コードWebSettings#setSavePassword(false)を初期化するときに設定WebViewすることです。その場合IF、ステートメントは失敗し、問題のあるコードは実行されません

于 2009-11-24T22:22:28.750 に答える