У меня есть сторонняя библиотека, которая периодически запрашивает у моего видеопроигрывателя (ExoPlayer) такую информацию, как текущая позиция в видео. Эта сторонняя библиотека работает в фоновом потоке. Проблема в том, что фоновый поток не может получить доступ к экземпляру ExoPlayer.
Одна из моих идей заключалась в том, чтобы использовать сопрограммы для принудительного переключения на основной поток перед доступом к экземпляру ExoPlayer. Примерно так (обратите внимание, что это вызывается из нескольких мест, как в основном, так и в фоновом потоках):
suspend fun getCurrentPosition(): Long {
if (Looper.myLooper() != Looper.getMainLooper()) {
// On a background thread, switch to main thread and return current position
return withContext(Dispatchers.Main) {
exoPlayerInstance.currentPosition
}
} else {
// Already on main thread, no need to switch threads
return exoPlayerInstance.currentPosition
}
}
Тогда я бы назвал это с помощью runBlocking следующим образом:
runBlocking { videoPlayerWrapper.getCurrentPosition() }
runBlocking используется, потому что сторонняя библиотека ожидает мгновенный результат.
Иногда это работает, но в других случаях мое приложение полностью блокируется. Есть идеи, что может быть не так? Есть альтернативные решения?