WebView вызывает исключение SQLiteDiskIOException - PullRequest
9 голосов
/ 23 августа 2011

В течение некоторого времени я получаю отчеты об исключениях SQLiteDiskIOException (через 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 в моем собственном коде, но это не помогло.

Полный дамп LogCat здесь.

Кто-нибудь знает, как я мог бы предотвратить, поймать или более четко выделить причину этих исключений? Они слишком часты, чтобы просто быть вызваны плохой памятью 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 ]

5 голосов
/ 29 августа 2011

Вы можете использовать setUncaughtExceptionHandler () , чтобы перехватить исключение и изящно обработать его.

3 голосов
/ 20 января 2012

Я тоже изо всех сил пытаюсь найти точный источник этих ошибок.Я нашел ветку на форуме AdMob групп Google , в которой говорится, что она может быть связана с AdMod SDK.Для меня эти ошибки начали появляться после того, как я опубликовал свое последнее обновление, которое среди прочих изменений включало в себя обновление AdMob SDK с v4.1.1 до v4.3.1.Вы используете AdMob?

Похоже, что AdMob SDK в некоторых случаях манипулирует своими WebViews из потока пользовательского интерфейса, что, как я предполагаю, может вызвать различные проблемы, например, одновременный доступ к SQLite из разных потоков при управлении кешем.Возможно, связано с SQLiteDiskIOException в Android .Также стоит проверить, что ваш собственный код не манипулирует WebViews вне потока пользовательского интерфейса.

2 голосов
/ 27 августа 2011

Обнаружена проблема на 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...