Мое Android приложение имеет ViewModel, который выполняет операции с базой данных SQLite с использованием Kotlin сопрограмм.
Если Фрагмент ViewModel закрыт во время выполнения операций БД, я хочу убедиться, что БД правильно закрыт, поэтому нет утечек. Чтобы убедиться, что я не закрываю БД, пока она еще используется, я сначала отменяю задание ViewModel, а затем вызываю db.close ().
Однако, если я закрываю фрагмент во время операции все еще выполняется, я получаю следующую ошибку:
IllegalStateException: Cannot perform this operation because the connection pool has been closed.
Как я могу отменить запущенные задания, чтобы безопасно закрыть базу данных?
ViewModel:
class MyViewModel(
private val db: DatabaseHelper,
) : ViewModel() {
private var viewModelJob = Job()
private val uiScope = CoroutineScope(Dispatchers.Main + viewModelJob)
init {
initialize()
}
override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
db.close()
}
private fun initialize() {
uiScope.launch {
runQuery()
}
}
private suspend fun runQuery() {
return withContext(Dispatchers.IO) {
//Perform long-running db operations
}
}
}
Трассировка стека указывает на операции в функции runQuery (), которые все еще выполняются после закрытия БД. Я не понимаю, как эта операция все еще выполняется, когда я закрываю базу данных, так как я уже позвонил viewModelJob.cancel()