WebView вызывает SQLiteDiskIOException

Я получаю сообщения о 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 в моем собственном коде, но это не помогло.

Здесь выгружаются полные 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> 

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

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

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

На сайте code.google есть проблема.

EDIT: если вы готовы отключить кеш, частота исключения может немного уменьшиться.

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