Java android.webkit.WebViewClassic.loadDataWithBaseURL 中来自 Webview 的空指针异常

Java nullpointer exception from Webview in android.webkit.WebViewClassic.loadDataWithBaseURL

按照 中提供的建议,我修改了我的 AdMob 代码以符合这些建议,这有效地减少了出现的异常数量。然而,一个新的异常正在上升。

代码如下:

@Override
protected void onDestroy() {
    if ( adView != null ) {
          adView.destroy();
          adView = null;

          Log.i(ApplicationData.APP_TAG, TAG + ": OnDestroy, destroying the Adview");
     }

    super.onDestroy();
}

adView.destroy() 方法似乎在发布 LogCat 消息时运行良好。在此消息之后,我在 WebView 上收到以下异常:

java.lang.NullPointerException
    at android.webkit.WebViewClassic.loadDataWithBaseURL(WebViewClassic.java:2741)
    at android.webkit.WebView.loadDataWithBaseURL(WebView.java:919)
    at com.google.android.gms.ads.internal.request.n.run(SourceFile:206)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:153)
    at android.app.ActivityThread.main(ActivityThread.java:5297)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
    at dalvik.system.NativeStart.main(Native Method)

不幸的是,我找不到重现问题的方法,但在生产中经常发生。我没能找到任何问题,有人能告诉我我能做什么吗?

Google 移动广告 SDK 团队之一说(3 月 14 日),

We looked into this issue when it was first reported, and a fix has been released within Google Play services. You should see fewer and fewer instances as your users' devices update to the new version.

参考https://groups.google.com/forum/#!topic/google-admob-ads-sdk/oYpQI_L14Tg

当 WebView 在调用 loadDataWithBaseUrl 之前被销毁时会发生这种情况(可能由其他线程调用)。在 AdMob 代码中,我看到他们现在按如下方式处理此问题

public void loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl) {
        synchronized(this) {
            if(!this.isDestroyed()) {
                super.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
            } else {
                Log.d("The webview is destroyed. Ignoring action.");
            }

        }
    }

所以现在应该不会发生了。