Как безопасно закрыть базу данных в ViewModel? - PullRequest
0 голосов
/ 13 февраля 2020

Мое 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()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...