【问题标题】:App freezes when CoroutineDispatcher is called inside a CoroutineDispatcher在 CoroutineDispatcher 中调用 CoroutineDispatcher 时应用程序冻结
【发布时间】:2021-04-02 23:16:08
【问题描述】:

我在 MyActivity 中玩得很开心,看起来像这样

GlobalScope.launch(Dispatchers.Main) {
                mainFunction()
            }

还有一个 mainFunction 的乐趣

private suspend fun mainFunction() = withContext(Dispatchers.Default) {

                if (test1!!) {
                    some code                          
                } else {
                   some code 
                }     
    }

和 test1 的乐趣

 private suspend fun test1(start: Date): Boolean? {
        try {        
            if (status?.code == 200) {
              some code
           true
            } else if status?.code == 401) {
                reLoginUser()
               true
            }

        } catch (e: IOException) {
            false
        }
        return true
    }

重新登录用户乐趣

private suspend fun reLoginUser() {
       re login code
        if (loginResponse != null && statusCode == 200) {
           mainFunction()          
        } 
        } else {
           some code
        }
    }

我需要以这种方式引入 reLoginUser 乐趣。从那时起,我的应用程序在执行所有操作时都会冻结。工作已完成,但应用程序冻结。我不知道为什么会这样,我猜它实际上在 mainFunction() 内部调用 mainFunction()。这样做的正确方法是什么?我做错了什么?

【问题讨论】:

    标签: java android kotlin kotlin-coroutines


    【解决方案1】:

    你陷入了一个无限循环。

    我的猜测是您的 status.code 始终为 401(出于某种原因,可能是 Internet 连接或其他原因),因此您的 test1 函数调用 reLoginUser() 尝试再次登录并得到相同的错误 (401)导致此循环重新开始。

    所以,注释掉这一行:reLoginUser()。如果您的代码没有冻结,则意味着您必须重写 reLoginUser() 函数并避免陷入循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      相关资源
      最近更新 更多