协程“ withContext”不再可访问和读取,无故停止工作

时间:2019-07-09 15:52:51

标签: android kotlin kotlin-coroutines

我正在使用Architecture Components and Room,但我不认为它来自那里 我使用协程从数据库中插入和检索数据。一切正常,直到我来到this problem

最后一个问题已解决,但他引起了另一个问题。我以前插入数据的协程之一运行良好,现在withContext(Dispatchers.IO) { 中的代码从未读取过。其他所有功能都在起作用,而这个功能过早了。 该应用不会崩溃,没有错误日志,但由于从未读取withContext而未插入数据

我尝试过重建项目,重新启动Android Studio,重新安装应用程序,但是没有任何效果,我将错误缩小到了几行,但是我在网上找不到关于该错误的任何信息,我'尝试过重命名它,并通过另一个函数传递它,但是什么也没做,这是黑魔法,我不知道为什么它突然停止工作,在过去的一周我什至没有修改代码。

fun insertNewStats(sessionID: Long, fishSpeciesID: Int) {
        uiScope.launch {
            //This access to database is working fine
            val stats = checkDatabaseForStats(sessionID, fishSpeciesID)
            if (stats == null) {
                //This is the call of the function that is not working
                insertStatsToDatabase(sessionID, fishSpeciesID)
            } else {
                stats.numberOfCatch++
                updateStatsToDatabase(stats)
            }
        }
    }

这是checkDatabaseForStats,如果我将插入物放在此处,它将可以完美工作,这意味着它不是来自DAO函数,而是来自withContext

private suspend fun checkDatabaseForStats(sessionID: Long, fishSpeciesID: Int) : SessionsFishStats?{
    return withContext(Dispatchers.IO) {
        val stats = database.getStat(sessionID, fishSpeciesID)
        stats
    }
}

无效的部分,已达到功能,而不是 withContext

private suspend fun insertStatsToDatabase(sessionID: Long, fishSpeciesID: Int) {
        //This function is reached, the code put there will be read and work
        withContext(Dispatchers.IO) {
            //And from there nothing, this code is never reached
            database.insertStats(
                SessionsFishStats(fk_sessionId = sessionID, fishSpeciesId = fishSpeciesID, numberOfCatch = 1L)
            )
        }
    }

这是我的DAO中的查询

@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertStats(stats: SessionsFishStats)

如果我将withContext直接放在insertNewStats中(不通过函数传递),也将不起作用

我想提醒一下,这段代码曾经很好地运行,并且在发生不相关的错误时停止了工作。该应用程序不会崩溃,只是代码未读。 我的应用程序中的所有其他Insert查询都可以正常工作,其他所有withContext和DAO函数也都可以正常工作,只是因为黑魔法而已被诅咒的那个


我已经做到了,这就是将所有内容都放在同一个函数中,并且效果很好。很奇怪,我也不知道为什么...

fun whyIsThisWorking(sessionID: Long, fishSpeciesID: Int) {
        uiScope.launch {
            withContext(Dispatchers.IO) {
                val stat = database.getStat(sessionID, fishSpeciesID)
                if (stat == null) {
                    database.insertStat(
                        SessionsFishStats(fk_sessionId = sessionID, fishSpeciesId = fishSpeciesID, numberOfCatch = 1L)
                    )
                } else {
                    stat.numberOfCatch++
                    database.updateStats(stat)
                }
            }
        }
    }

0 个答案:

没有答案