Ich habe eine App, die ContentProvider für den Zugriff auf SQLite verwendet. Eine Instanz von SQLiteOpenHelper wird in den Providern onCreate erstellt:
%Vor%SQLiteDatabase-Instanzen, die in den Methoden insert / update / delete / query abgerufen wurden, werden nicht manuell geschlossen. Keine dieser Methoden ist als synchronisiert gekennzeichnet. Auf ContentProvider wird von mehreren Threads aus zugegriffen, die von UI und Diensten gestartet wurden.
Beispiel Stacktrace:
%Vor%Die Dinge funktionierten bis zu dem Moment, als ich eine Klasse hinzufügte, die Schreibvorgänge mit Hilfe eines von Looper von HandlerThread initialisierten Handlers in bestimmte Tabellen serialisiert. Danach habe ich angefangen, viele SQLiteDiskIOExceptions mit den Fehlercodes 3850 und 0 zu sehen (kein Fehler?). Interessanterweise treten 90% dieser Abstürze mit Nexus 4 und einer Handvoll anderer Geräte auf.
Ich habe Unit-Tests ausgeführt, um den Zustand zu simulieren, konnte das Problem jedoch nicht reproduzieren. Es gibt andere Fragen, die bereits verwandte Themen diskutieren (zB hier: Synchronisieren Sie den Zugriff auf Content Provider ) ) aber für mich scheint der ursprüngliche Grund für diesen Fehler noch ein wenig unklar zu sein. Also, was sind wirklich die Gründe für Fehler 3850?
Tags und Links android android-contentprovider thread-safety