fix: Cache errors when rapidly switching sources #68
+79
−45
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Root cause: calling
SQLiteDatabase.close()
(viause
) is not thread-safe, even though it appears to be. This is a problem because media3's loader is multithreaded. TheSQLiteDatabase
andSQLiteCursor
all have guards around their init and closing logic, but the underlyingSQLiteConnectionPool
isn't guarded adequately in this case. Since a singleCacheDatastore
can be used by multiple loader threads (as-designed in media3), we can't rely onSQLiteDatabase.close()
.Because of all of that, rapidly switching media sources many times (like when fling-scrolling a feed) would occasionally result in playback errors
Solution: Explicitly keep an open
SQLiteDatabase
object around for as long as aPlayer
needs aCacheDatastore
. This is fine to do, and was the general intent of my last attempt at fixing this. Before, I was usingacquireReference
to hopefully keep theSQLiteDatabase
's underlying connection open even ifclose()
was called. This wasn't effective thanks to media3's multithreaded loading behavior. Now, we just keep the DB object (and therefore connection) open until we are closed (when ourMuxPlayer
is released)