V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
magic3584
V2EX  ›  Android

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

  •  
  •   magic3584 · 6 天前 · 1161 次点击
    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 ,绝了😂
    32 条回复    2024-12-11 18:06:44 +08:00
    lisongeee
        2
    lisongeee  
       6 天前   ❤️ 2
    ```kt
    suspend fun updateArea(context: Context): Boolean {
    TODO()
    }

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

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

    @iOCZS #5
    惭愧,近几年原生代码写的少很多,swift 5.几以后的 await async 没怎么用了,swiftUI 用了一下坑不少也没怎么实践。目前还是习惯用 delegate 和 block 来处理异步事件。
    yazinnnn0
        7
    yazinnnn0  
       6 天前
    做不到的, 只能在 kotlin 代码里处理成 Future 之类的东西,再扔给 java
    Achieve7
        8
    Achieve7  
       6 天前
    我刚开始学的时候也踩过这个坑, 只能转成 java 的线程处理类 future completed 之类的才行
    lmshl
        9
    lmshl  
       6 天前   ❤️ 1
    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
        10
    guoziq09  
       6 天前
    你甚至不想搜索一下协程这两个字。
    fun test(){
    CoroutineScope(Dispatchers.Main).launch {
    testCoroutine()
    }
    }

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

    @lmshl #9
    老项目了

    @guoziq09 我直接搜 java 调用 kotlin suspend, 出来的挺复杂。
    zoharSoul
        12
    zoharSoul  
       6 天前
    @magic3584 #11 感觉比 iOS 好上手很多啊
    互相调用也丝滑
    as 也比 xcode 好用的多
    e3c78a97e0f8
        13
    e3c78a97e0f8  
       5 天前 via iPhone
    @magic3584 OC 调用 Swift 的 async await 也不简单吧,好像是完全不行?
    magic3584
        14
    magic3584  
    OP
       5 天前
    @zoharSoul #12
    就我 oc swift flutter rn vue 的过往经验来说,java 是最难的
    magic3584
        15
    magic3584  
    OP
       5 天前
    @e3c78a97e0f8 #13
    不太清楚,async await 之后就没写过桥接代码
    zoharSoul
        16
    zoharSoul  
       5 天前
    @magic3584 #14 好吧 我个人经验感觉 oc 是最难的, 语法稀奇古怪...
    mtdhllf
        17
    mtdhllf  
       5 天前
    AreaManager 要做单例,你直接 object AreaManager{ }就可以了
    fuckshiter
        18
    fuckshiter  
       5 天前
    我是使用了 future
    ck19920702
        19
    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
        20
    magic3584  
    OP
       5 天前
    @ck19920702 #19
    请问方法返回的 Bool 在哪取呢
    ck19920702
        21
    ck19920702  
       5 天前   ❤️ 1
    @magic3584 #20 public void resumeWith(@NonNull Object o) o 强制转成 Boolean
    getContext() 返回 EmptyCoroutineContext.INSTANCE
    Kamiyu0087
        22
    Kamiyu0087  
       19 小时 5 分钟前
    为啥不直接用 kotlin 写呢?
    magic3584
        23
    magic3584  
    OP
       19 小时 4 分钟前
    @Kamiyu0087 #22
    老项目,java kotlin 都有。而我是新新手,只能就着改改
    magic3584
        24
    magic3584  
    OP
       15 小时 49 分钟前
    @lisongeee #2
    @location123 #3
    @GotKiCry #4
    @yazinnnn0 #7
    @Achieve7 #8
    @lmshl #9
    @guoziq09 #10
    @zoharSoul #12
    @mtdhllf #17
    @fuckshiter #18
    @ck19920702 #19
    @Kamiyu0087 #22
    请教各位大佬,怎么快速知道当前是哪个 activity? 我用命令行 ` adb shell dumpsys activity top | grep ACTIVITY` 时好时不好。现在只能搜索当前页面上的字去一个一个找
    zoharSoul
        25
    zoharSoul  
       15 小时 38 分钟前
    @magic3584 #24 as 上直接就可以看到啊
    ck19920702
        26
    ck19920702  
       15 小时 24 分钟前   ❤️ 1
    @magic3584 #24 as 里 logcat 过滤下 :message:Displayed ,记得把包名限制去掉。 过滤日志那一行只保留 message:Displayed ,可以看到当前 Activity
    location123
        27
    location123  
       13 小时 12 分钟前
    @magic3584 #24 试下 adb shell dumpsys window | grep Activity
    查看 window 上的 activity 我不是专业的 Android 开发
    magic3584
        28
    magic3584  
    OP
       13 小时 9 分钟前
    @ck19920702 #26 感谢,有些可用,只不过有一些会打印 ` myPackage.ComposeActivity ( ComposeActivity: ComponentActivity())`

    @zoharSoul #25
    是用 26 楼方法吗?
    zoharSoul
        29
    zoharSoul  
       12 小时 58 分钟前
    @magic3584 #28 不是的,
    as 直接有个功能叫 Activity Profiler 可以直接看到
    或者用 layout Inspector 也能直接看到
    zoharSoul
        30
    zoharSoul  
       12 小时 55 分钟前   ❤️ 1
    magic3584
        31
    magic3584  
    OP
       12 小时 41 分钟前
    @zoharSoul #30
    感谢,布局确实很清楚。iOS 的话用 Xcode 也就看看 Controller 了
    zoharSoul
        32
    zoharSoul  
       12 小时 37 分钟前
    @magic3584 #31 不客气哦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:44 · PVG 06:44 · LAX 14:44 · JFK 17:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.