【问题标题】:WebView causes SQLiteDiskIOExceptionWebView 导致 SQLiteDiskIOException
【发布时间】:2011-11-01 18:33:41
【问题描述】:

我已经收到关于 SQLiteDiskIOExceptions 的报告有一段时间了(通过 Flurry/acra)。我无法在本地重现该问题,但这是我最常见的崩溃,在糟糕的一天中每 50 个会话中发生一次。它们在 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>

【问题讨论】:

  • 请说明您是如何实现 webview 的。
  • 编辑了问题以包含代码。我确实看到了这个:stackoverflow.com/questions/3130654 最近,因此我正在考虑以编程方式而不是使用 XML 创建 WebView。
  • 对于未能在赏金到期前接受答案表示歉意(授予了一半的赏金)——一些 RL 问题分散了我的注意力,我错误地认为它还有一天的运行时间。
  • @SvenViking 以下解决方案对您有用吗?
  • tarkeshwar:不完全是。不过,我确实发现我添加的一种清除缓存的方法是为了解决这个问题实际上让情况变得更糟,所以通过恢复它,我能够将错误的频率降低到模糊的可容忍水平。

标签: android sqlite exception webkit webview


【解决方案1】:

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

【讨论】:

  • 谢谢,我会尽快尝试。 (需要一些时间,因为我自己无法重现该问题)。
【解决方案2】:

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

似乎 AdMob SDK 在某些情况下会在 UI 线程之外操作其 WebView,我猜这可能会导致各种问题,例如在管理缓存时来自不同线程的并发 SQLite 访问。可能与SQLiteDiskIOException in Android 有关。也可能值得检查您自己的代码不会在 UI 线程之外操作 WebView。

【讨论】:

  • Leif:我正在使用 AdMob 和 MobClix。我猜想几个广告 SDK 会导致或加剧这个问题,并且一起使用多个广告 SDK 会使由于冲突而导致的问题成倍增加。谢谢,关于确保 WebView 内容保留在 UI 线程上的好处。
【解决方案3】:

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);
}

【讨论】:

  • 谢谢。我之前确实看到过,但它并没有真正帮助我。崩溃的报告非常频繁,并且知道它可能会在未来的某些 Android 版本中得到修复(可能在几年内不会被广泛采用)是一个小小的安慰:/。我想知道的是是否有任何方法可以解决这个问题,比如扩展 WebView 并在自定义类中捕获 SQL 错误或其他东西。 (由于不同 Android 版本中的所有不同 WebView 修订,猜测这可能会很棘手)...
  • 谢谢,如果找不到更好的解决方案,我可能会考虑。不过,缓存对我的应用非常有用:(。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多