英文:
Call suspend function in non suspend function
问题
当在Android应用程序中使用Kotlin进行实现时,我遇到了这个问题。
我必须覆盖一个存在于aar中的函数,所以我不能更改它。它是一个非暂停函数。
// 来自aar
class A {
fun doSomething()
}
但我必须覆盖这个函数并调用暂停函数。像这样
class B() : A {
override fun doSomething() {
// **我想在这里调用一个暂停函数**
}
}
我是Kotlin中的新手。据我所知,我可以使用 runBlocking 使其工作。是否有其他关于此的想法?
顺便问一下,我还想知道协程的缺点是什么?
- Kotlin文档说它将节省内存。我们可以创建尽可能多的协程。
Kotlin协程与其他语言(C ++,Go)有什么不同?
英文:
When using Kotlin in Android app implemention, I met this problem.
I must overwrite a function which is in the aar, so I can not change the it. It is a non suspend function.
// from the aar
class A{
fun doSomething()
}
But I have to overwrite this function and call suspend function. like this
class B() : A{
overwrite fun doSomething(){
// **I want to call a suspend function here**
}
}
I am a new guy in Kotlin. As I know, I can use runBlocking to let it work.
Is there any other ideas on this?
Btw I also want to ask what is the Cons of the coroutines?
- Kotlin document said it will save the memory. We can create it as many as we can.
What is the difference of Kotlin corountines with others (C++, Go)?
using runBlock in my codes
答案1
得分: 1
-
使用
runBlocking
,但它将阻塞您的函数。您的库必须能够处理此函数作为阻塞函数。如果库在主线程上调用此函数,这可能没问题,但如果如此,将会出现问题。 -
从此函数中启动一个协程,该协程将以异步方式运行代码。函数会立即返回,而协程会在未来某个时刻完成。如果您不需要等待结果,这个解决方案是可以的。
如果启动协程,请确保使用适当的 CoroutineScope,以避免内存泄漏。阅读 Kotlin 协程文档,了解 CoroutineScope 的含义。基本上,当取消 CoroutineScope 时,仍在运行的所有已启动协程也将被取消。因此,当启动协程时,您希望使用在适当时间被取消的作用域,以避免内存泄漏。例如,在 Android Fragment 中,可以使用 viewLifecycleOwner.lifecycleScope
来启动捕获视图引用的协程,这将防止这些协程泄漏视图。
英文:
You have two choices:
-
Use
runBlocking
, but it will block your function. Your library will have to be able to handle this function being a blocking function. It might be fine, but it will be a problem if the library is calling this function on the main thread. -
Launch a coroutine from this function, which will run the code asynchronously. The function will return immediately while the coroutine is started asynchronously and will finish some time in the future. This solution is OK if you don't need to wait for the result.
If you launch a coroutine, make sure you use an appropriate CoroutineScope so you don't leak memory. Read the Kotlin coroutines documentation to understand what is the meaning of CoroutineScope. Basically, when a CoroutineScope is cancelled, all its launched coroutines that are still running will also be cancelled. So, when you launch a coroutine, you want to use a scope that will be cancelled at an appropriate time to avoid leaking memory. For example, in an Android Fragment, use the viewLifecycleOwner.lifecycleScope
to launch coroutines that capture references to views, and this will prevent those coroutines from leaking views.
答案2
得分: 0
If you use runBlocking, it will block the current thread. However, you can use GlobalScope as below.
使用 runBlocking 会阻塞当前线程。但是,你可以像下面这样使用 GlobalScope。
override fun doSomething(){
GlobalScope.launch {
// code here
}
}
英文:
If you use runBlocking, it will block the current thread. However, you can use GlobalScope as below.
overwrite fun doSomething(){
GlobalScope.launch {
// code here
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论