1

我在 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)

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

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

4

2 回答 2

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;
}
于 2012-08-20T18:34:00.587 回答
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;
    }
}
于 2012-08-20T15:50:03.380 回答