在Gingerbread之前的设备上从WebViewDatabase获取无法捕获的NPE的解决方法

时间:2012-08-20 15:50:03

标签: android android-webview

我在Gingerbread之前的设备上遇到了这个无法捕获的异常:

java.lang.NullPointerException: null
 at android.webkit.WebViewDatabase.getCacheTotalSize(WebViewDatabase.java:735)
 at android.webkit.CacheManager.trimCacheIfNeeded(CacheManager.java:557)
 at android.webkit.WebViewWorker.handleMessage(WebViewWorker.java:195)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:123)
 at android.os.HandlerThread.run(HandlerThread.java:60)

我只使用WebView for AdMob广告,所以这很烦人。

有没有办法阻止这些崩溃?

2 个答案:

答案 0 :(得分:0)

如果您的minSdkLevel是Donut或更高版本,请尝试此操作(在加载任何广告之前):

if (VERSION.SDK_INT < 9) {
    try {
        Method m = WebViewDatabase.class.getDeclaredMethod("getCacheTotalSize");
        m.setAccessible(true);
        m.invoke(WebViewDatabase.getInstance(thisContext));
    }
    catch (Exception e) {
        // disable webview/ads
    }
}

如果你的minSdkLevel早于Donut,你需要使用另一种方法来测试SDK级别:

private static int getSdkInt() {
    try {
        return Integer.parseInt(VERSION.SDK);
    }
    catch (Throwable t) {
        return -1;
    }
}

答案 1 :(得分:0)

我得到了它的工作:

public static final boolean webViewIsProbablyCorrupt(Context context) {
    try {
        SQLiteDatabase cacheDb = context.openOrCreateDatabase("webviewCache.db", 0, null);

        if (cacheDb != null) {
            cacheDb.close();
            return false;
        }
    } catch (Throwable t) {
        Log.w(TAG, t);
    }

    return true;
}