1

私はNullPointerExceptionAndroid 2.3.4 で次の呼び出しを取得しています:

java.lang.NullPointerException
    at android.webkit.WebView.addPackageNames(WebView.java:4063)
    at com.my.company.MyClass$MyInnerClass.myMethod(MyClass.java:283)
    at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
    at android.webkit.BrowserFrame.stringByEvaluatingJavaScriptFromString(Native Method)
    at android.webkit.BrowserFrame.loadUrl(BrowserFrame.java:246)
    at android.webkit.WebViewCore.loadUrl(WebViewCore.java:1981)
    at android.webkit.WebViewCore.access$1400(WebViewCore.java:53)
    at android.webkit.WebViewCore$EventHub$1.handleMessage(WebViewCore.java:1122)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.webkit.WebViewCore$WebCoreThread.run(WebViewCore.java:674)
    at java.lang.Thread.run(Thread.java:1019)

MyClass$MyInnerClass が JavaScript インターフェイスに追加されます。

class MyClass {
    // ...
        myWebView.addJavascriptInterface(new MyInnerClass(), "MyInnerClass");
    // ...

    public void myOuterMethod(int param1, int param2) {
        // Notify a listener that myOuterMethod was called
    }

    private class MyInnerClass {
        public void myMethod(int param1, int param2) {
            myOuterMethod(param1, param2);
        }
    }
}

そのため、JavaScript 呼び出しMyInnerClass.myMethod(-1, -1)は Java-JavaScript ブリッジを正常に通過しているように見えますが、呼び出しに失敗しましたaddPackageNames。これは私のコードではありません。

GrepCodeandroid.webkit.WebViewクラスを見てきましたが、どうやってこれを引き起こしたのかわかりません。入っている唯一のラインaddPackageNames

public void addPackageNames(Set<String> packageNames) { 
    mWebViewCore.sendMessage(EventHub.ADD_PACKAGE_NAMES, packageNames);
}

だから、私はどちらmWebViewCoreEventHubがであるという結論に達しましたnull

Android の専門家は、これに光を当てることができますか? これは既知のバグですか? 私がこれを引き起こしたのですか?もしそうなら、どのように?そうでない場合、どうすればこれを防ぐことができますか?

4

2 に答える 2

0

mWebViewCoreこれは、に設定されていることに明確に関連していnullます。

mWebViewCoreViewViewのコンストラクター内でインスタンス化されます。そして、それが設定されている唯一の場所はnullパブリックメソッドdestroy()です。

webView.destroy()コードのどこかに電話しますか?

于 2012-10-02T19:44:47.993 に答える
0

あなたの問題は、 myMethod が呼び出されたときに外部クラスがインスタンス化されていないことです。ここで少し興味深いのは、あなたのケースで壊れているように見える内部コードが、Android 4.0 ソース コードにはもう存在しないことです。そのため、そのバージョンの Android では問題が発生しない可能性があります。これは、以前のバージョンの Android Webview に問題があり、おそらく Android で問題が発生していることを示しています。しかし、それは単なる憶測です。私の経験では、通常、Android チームではなく、何か間違ったことをしているということです :)

コードを if ステートメントでラップすることで解決できる可能性があります。

if(MyClass.this != null) {
    myOuterMethod(param1, param2);
}

これは美しい解決策ではありませんが、うまくいけば何も壊れることはないと思います。

于 2012-10-04T12:41:39.477 に答える