我已经获得SQLiteDiskIOExceptions的报告已经有一段时间了(通过Flurry / acra)。我无法在本地重现这个问题,但这是我最常见的崩溃,在糟糕的一天发生了五十次一次。在Android 2.3.x下,它们似乎特别频繁。
我在自己的代码中完全不使用SQL,但我有多个WebView同时运行(两个,加上一个广告SDK)。所有错误似乎都是由WebView引起的,通过以下任何一种方法之一:
(还收到了一些关于android.database.sqlite.SQLiteDatabaseCorruptException的报告,但这些报告极为罕见)。我在自己的代码中注释掉了与清除WebView缓存相关的任何内容,但这没有帮助。
有谁知道我可以预防,捕获或更清楚地隔离这些例外的原因的任何方式?它们太频繁而不仅仅是由坏的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>
答案 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);
}