WebView导致SQLiteDiskIOException

时间:2011-08-23 08:53:41

标签: android sqlite exception webkit webview

我已经获得SQLiteDiskIOExceptions的报告已经有一段时间了(通过Flurry / acra)。我无法在本地重现这个问题,但这是我最常见的崩溃,在糟糕的一天发生了五十次一次。在Android 2.3.x下,它们似乎特别频繁。

我在自己的代码中完全不使用SQL,但我有多个WebView同时运行(两个,加上一个广告SDK)。所有错误似乎都是由WebView引起的,通过以下任何一种方法之一:

  • android.webkit.WebViewDatabase.clearCache
  • android.webkit.WebViewDatabase.flushCacheStat
  • android.webkit.WebViewDatabase.deleteCookies
  • android.webkit.WebViewDatabase.removeCache

(还收到了一些关于android.database.sqlite.SQLiteDatabaseCorruptException的报告,但这些报告极为罕见)。我在自己的代码中注释掉了与清除WebView缓存相关的任何内容,但这没有帮助。

Full LogCat dumps here.

有谁知道我可以预防,捕获或更清楚地隔离这些例外的原因的任何方式?它们太频繁而不仅仅是由坏的SD内存引起的。

谢谢!

编辑:按要求输入源代码:

  browser=(WebView)findViewById(R.id.webkit);
  browser.setWebViewClient( new CustomWebViewClient(this,browser) );
  WebSettings webSettings = browser.getSettings();
  webSettings.setJavaScriptEnabled(true);
  webSettings.setPluginsEnabled(true);
  browser.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_OVERLAY);
  webSettings.setBuiltInZoomControls(true);

  browser.setWebChromeClient(new WebChromeClient() {
    public void onProgressChanged(WebView view, int progress) {
      progressbarhorizontal.setProgress(progress);
    }
  });

XML:

        <WebView android:id="@+id/webkit" android:layout_width="fill_parent" android:layout_height="fill_parent" android:focusable="true" android:nextFocusDown="@+id/bottomview"></WebView>

3 个答案:

答案 0 :(得分:5)

您可以使用setUncaughtExceptionHandler()来捕获异常并优雅地处理它。

答案 1 :(得分:3)

我也在努力寻找这些错误的确切来源。我发现a thread on the Google Groups AdMob forum表明它可能与AdMod SDK有关。对我来说,在我发布最新更新后,这些错误开始显现,其中包括将AdMob SDK从v4.1.1升级到v4.3.1。你在使用AdMob吗?

似乎AdMob SDK在某些情况下从UI线程中操纵其WebViews,我想这可能会导致各种问题,可能是在管理缓存时从不同线程进行并发SQLite访问。可能与SQLiteDiskIOException in Android有关。可能还值得检查一下你自己的代码不会从UI线程中操纵WebViews。

答案 2 :(得分:2)

code.google网站报告了一个问题。

编辑:如果您准备禁用缓存,则异常的频率可能会略微降低。

try
{
  Method m = CacheManager.class.getDeclaredMethod("setCacheDisabled", boolean.class);
  m.setAccessible(true);
  m.invoke(null, true);
}
catch (Throwable e)
{
  Log.i("myapp","Reflection failed", e);
}