怎么在 Java 里调用 Kotlin 的 suspend 方法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rrubick
V2EX    Android

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

  •  
  •   rrubick 314 天前 4807 次点击
    这是一个创建于 314 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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  
       314 天前   2
    ```kt
    suspend fun updateArea(context: Context): Boolean {
    TODO()
    }

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

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

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

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

    @lmshl #9
    老项目了

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

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

    }
    });


    直接 as 里面调用, 输入自动就提示了吧
    rrubick
        20
    rrubick  
    OP
       313 天前
    @ck19920702 #19
    请问方法返回的 Bool 在哪取呢
    0x0x
        21
    0x0x  
       313 天前   1
    @magic3584 #20 public void resumeWith(@NonNull Object o) o 强制转成 Boolean
    getContext() 返回 EmptyCoroutineContext.INSTANCE
    Kamiyu0087
        22
    Kamiyu0087  
       308 天前
    为啥不直接用 kotlin 写呢?
    rrubick
        23
    rrubick  
    OP
       308 天前
    @Kamiyu0087 #22
    老项目,java kotlin 都有。而我是新新手,只能就着改改
    rrubick
        24
    rrubick  
    OP
       308 天前
    @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  
       308 天前
    @magic3584 #24 as 上直接就可以看到啊
    0x0x
        26
    0x0x  
       308 天前   1
    @magic3584 #24 as 里 logcat 过滤下 :message:Displayed ,记得把包名限制去掉。 过滤日志那一行只保留 message:Displayed ,可以看到当前 Activity
    location123
        27
    location123  
       308 天前
    @magic3584 #24 试下 adb shell dumpsys window | grep Activity
    查看 window 上的 activity 我不是专业的 Android 开发
    rrubick
        28
    rrubick  
    OP
       308 天前
    @ck19920702 #26 感谢,有些可用,只不过有一些会打印 ` myPackage.ComposeActivity ( ComposeActivity: ComponentActivity())`

    @zoharSoul #25
    是用 26 楼方法吗?
    zoharSoul
        29
    zoharSoul  
       308 天前
    @magic3584 #28 不是的,
    as 直接有个功能叫 Activity Profiler 可以直接看到
    或者用 layout Inspector 也能直接看到
    zoharSoul
        30
    zoharSoul  
       308 天前   1
    rrubick
        31
    rrubick  
    OP
       308 天前
    @zoharSoul #30
    感谢,布局确实很清楚。iOS 的话用 Xcode 也就看看 Controller 了
    zoharSoul
        32
    zoharSoul  
       308 天前
    @magic3584 #31 不客气哦
    关于   帮助文档     自助推广系统     博客     API     FAQ     Solana     3045 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 00:30 PVG 08:30 LAX 17:30 JFK 20:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86