kotlin 在非挂起函数中调用挂起函数

crcmnpdw  于 2023-04-07  发布在  Kotlin
关注(0)|答案(2)|浏览(246)

在Android应用程序实现中使用Kotlin时,我遇到了这个问题。我必须覆盖aar中的一个函数,所以我不能更改它。它是一个非挂起函数。

// from the aar
class A{
    fun doSomething()
}

但是我必须覆盖这个函数并调用suspend函数。像这样

class B() : A{
    overwrite fun doSomething(){
        // **I want to call a suspend function here**
    }
}

我是Kotlin的新手。据我所知,我可以使用 runBlocking 来让它工作。在这方面还有其他想法吗?
顺便问一下,协程的缺点是什么?

  • Kotlin文档说它会保存内存。我们可以尽可能多地创建它。

Kotlin与其他语言(C++,Go)有什么不同?
在代码中使用runBlock

wbgh16ku

wbgh16ku1#

你有两个选择:
1.使用runBlocking,但它会阻塞你的函数。你的库必须能够处理这个函数是一个阻塞函数。这可能是好的,但如果库在主线程上调用这个函数,这将是一个问题。
1.从这个函数启动一个协程,它将异步运行代码。当协程异步启动时,函数将立即返回,并将在未来某个时间完成。如果您不需要等待结果,这个解决方案是可以的。
如果你启动了一个协程,请确保你使用了一个合适的协程范围,这样你就不会泄漏内存。阅读Kotlin协程文档,了解协程范围的含义。基本上,当一个协程范围被取消时,它启动的所有仍在运行的协程也会被取消。所以,当你启动一个协程时,你想使用一个会在适当的时候被取消的作用域,以避免内存泄漏。例如,在Android Fragment中,使用viewLifecycleOwner.lifecycleScope来启动捕获对视图的引用的协程,并且这将防止那些协程泄漏视图。

dgsult0t

dgsult0t2#

如果你使用runBlocking,它会阻塞当前线程。但是,你可以使用GlobalScope如下。

overwrite fun doSomething(){
         GlobalScope.launch {
           // code here
        }
     }

runBlockingGlobalScope

相关问题