哪些条件导致SQLiteDiskIOException代码3850

Juk*_*amo 8 android thread-safety android-contentprovider

我有一个使用ContentProvider访问SQLite的应用程序.在提供者onCreate中创建了一个SQLiteOpenHelper实例:

@Override
public boolean onCreate() {
    final Context context = getContext();
    mDBHelper = new MyDatabase(context);        
    return true;
} 
Run Code Online (Sandbox Code Playgroud)

在方法insert/update/delete/query中检索的SQLiteDatabase实例不会手动关闭.这些方法都没有标记为同步.从UI和服务启动的多个线程访问ContentProvider.

示例堆栈跟踪:

android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 3850)
at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
at android.database.sqlite.SQLiteDatabase.updateWithOnConflict(SQLiteDatabase.java:1574)
at android.database.sqlite.SQLiteDatabase.update(SQLiteDatabase.java:1520)
at com.sample.provider.MyProvider.update(SourceFile:0)
at android.content.ContentProvider$Transport.update(ContentProvider.java:260)
at android.content.ContentResolver.update(ContentResolver.java:1040)
Run Code Online (Sandbox Code Playgroud)

当我添加一个使用HandlerThread的Looper初始化的Handler序列化写入某些表的类时,事情一直很顺利.在此之后,我开始看到大量SQLiteDiskIOExceptions,错误代码为3850和0(不是错误?).有趣的是,这些崩溃中有90%发生在Nexus 4和少数其他设备上.

我一直在运行单元测试试图模拟条件,但无法重现问题.还有其他问题已经讨论过相关问题(例如:这里:同步对内容提供商的访问),但对我来说,这个错误的原因似乎仍然有点不清楚.那么3850错误的原因究竟是什么?