Qué condiciones causan el código SQLiteDiskIOException 3850

Tengo una aplicación que utiliza ContentProvider para acceder a SQLite. Se crea una instancia de SQLiteOpenHelper en los proveedores onCreate:

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

Las instancias de SQLiteDatabase recuperadas en los métodos insert / update / delete / query no se cierran manualmente. Ninguno de estos métodos está marcado sincronizado. Se accede a ContentProvider desde varios subprocesos iniciados desde la interfaz de usuario y los servicios.

Ejemplo de stacktrace:

 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) 

Las cosas funcionaron bien hasta el momento en que agregué una clase que serializa las escrituras a ciertas tablas usando un Handler inicializado por Looper de HandlerThread. Después de esto comencé a ver un montón de SQLiteDiskIOExceptions con códigos de error 3850 y 0 (no un error?). Curiosamente el 90% de estos accidentes ocurren con Nexus 4 y en un puñado de otros dispositivos.

He estado corriendo Pruebas de unidad tratando de simular la condición, pero han sido incapaces de reproducir el problema. Hay otras preguntas que ya tratan temas relacionados (por ejemplo, aquí: Sincronizar el acceso al proveedor de contenido ), pero para mí la causa original de este error parece todavía un poco confusa. ¿Cuáles son realmente las razones del error 3850?

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.