怎么在 Java 里调用 Kotlin 的 suspend 方法

6 天前
 magic3584
class AreaManager {
    companion object {
        @Volatile
        private var instance: AreaManager? = null

        @JvmStatic
        fun getInstance(): AreaManager {
            return instance ?: synchronized(this) {
                instance ?: AreaManager().also { instance = it }
            }
        }
    }
    suspend fun updateArea(context: Context): Boolean {
        val filePath = downloadFile(context)
        return when (filePath) {
            null -> false
            else -> true
        }
    }
}

我现在想在 fragment 的 java 代码里调用,应该怎么做?试了 Claude 、GPT 都没能实现,各种飘红。

android 也太难学了

  1. 不能像 iOS 和 flutter 一样,通过 IDE 快速的知道当前是哪个页面,只能根据页面上的文字去慢慢搜索
  2. 方法是类似 setOnClickListener(this) 结果回调又是在 onClick ,无法通过点击方法来跟踪调用。类似的还有 onNext 等,再搭配 vm 、adapter 和 presenter ,绝了😂
1167 次点击
所在节点    Android
32 条回复
sagaxu
6 天前
lisongeee
6 天前
```kt
suspend fun updateArea(context: Context): Boolean {
TODO()
}

fun syncUpdateArea(context: Context): Boolean {
return runBlocking { updateArea(context) }
}
```
location123
6 天前
如二楼 java 开一个线程 kt 中使用 runBlocking 调用 suspend 函数

或者 kotlin 多写一个函数转成 callback
GotKiCry
6 天前
给 Kotlin 再封装一层给 Java 是你最好的选择
iOCZS
6 天前
swift 的 await 和 Task 熟悉了吗?
magic3584
6 天前
感谢大佬们,可以了。
搜索结果让我再自定义个 CustomContinuation ,然后再实现 resume 啥的方法,完全不知道在哪获取返回结果😂

@iOCZS #5
惭愧,近几年原生代码写的少很多,swift 5.几以后的 await async 没怎么用了,swiftUI 用了一下坑不少也没怎么实践。目前还是习惯用 delegate 和 block 来处理异步事件。
yazinnnn0
6 天前
做不到的, 只能在 kotlin 代码里处理成 Future 之类的东西,再扔给 java
Achieve7
6 天前
我刚开始学的时候也踩过这个坑, 只能转成 java 的线程处理类 future completed 之类的才行
lmshl
6 天前
1. asCompletableFuture
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines.future/
UI 代码里可以用, 非阻塞
2. runBlocking
https://kotlinlang.org/api/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/run-blocking.html
非 UI 代码里可以用, 阻塞

建议都用 Kotlin 写, 没啥必要 Java/Kotlin 混写
guoziq09
6 天前
你甚至不想搜索一下协程这两个字。
fun test(){
CoroutineScope(Dispatchers.Main).launch {
testCoroutine()
}
}

suspend fun testCoroutine() = withContext(Dispatchers.IO){
delay(1000)
//todo
}
magic3584
6 天前
@yazinnnn0 #7
@Achieve7 #8
我寻思 oc 和 swift 相互调用没这么负责,这个东西我搞了俩小时没搞出来。
android 太难搞了

@lmshl #9
老项目了

@guoziq09 我直接搜 java 调用 kotlin suspend, 出来的挺复杂。
zoharSoul
6 天前
@magic3584 #11 感觉比 iOS 好上手很多啊
互相调用也丝滑
as 也比 xcode 好用的多
e3c78a97e0f8
5 天前
@magic3584 OC 调用 Swift 的 async await 也不简单吧,好像是完全不行?
magic3584
5 天前
@zoharSoul #12
就我 oc swift flutter rn vue 的过往经验来说,java 是最难的
magic3584
5 天前
@e3c78a97e0f8 #13
不太清楚,async await 之后就没写过桥接代码
zoharSoul
5 天前
@magic3584 #14 好吧 我个人经验感觉 oc 是最难的, 语法稀奇古怪...
mtdhllf
5 天前
AreaManager 要做单例,你直接 object AreaManager{ }就可以了
fuckshiter
5 天前
我是使用了 future
ck19920702
5 天前
AreaManager.getInstance().updateArea(this, new Continuation<Boolean>() {
@NonNull
@Override
public CoroutineContext getContext() {
return null;
}

@Override
public void resumeWith(@NonNull Object o) {

}
});


直接 as 里面调用, 输入自动就提示了吧
magic3584
5 天前
@ck19920702 #19
请问方法返回的 Bool 在哪取呢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1095291

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX