You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Kotlin中hubConnection.on()无法触发回调问题求助

Android端Kotlin SignalR客户端:on回调不触发的排查与修复

以下是针对你遇到的hubConnection.on()回调不触发问题的排查点和修复建议:

核心问题排查点

  • 回调注册时序错误
    你当前先调用Subscribe订阅方法,再注册ReceiveSimplifiedRealTime的回调。SignalR的消息回调必须在订阅操作前完成注册,否则服务器在订阅后立即推送的消息会因回调未注册而丢失,且不会触发任何异常。

  • Invoke调用未等待完成
    你用hubConnection.invoke(...).subscribe()执行订阅,但在协程中应使用挂起函数await()等待订阅操作完成,避免时序混乱。subscribe()仅订阅Observable结果,不会阻塞协程,可能导致回调未注册完成,订阅就已经执行完毕。

  • 参数类型不匹配
    服务器推送ReceiveSimplifiedRealTime的参数类型必须和客户端注册的String::class.java完全一致。如果服务器发送的是JSON对象而非纯字符串,客户端用String接收会匹配失败,SignalR不会抛出异常,但会直接跳过回调执行。

  • 连接对象生命周期问题
    如果hubConnection是局部变量,可能在协程执行完成后被GC回收,导致后续无法接收消息。需确保hubConnection是类级别的成员变量,在生命周期内保持引用。

修复后的代码示例

// 声明为类成员变量,避免被GC回收
private lateinit var hubConnection: HubConnection

lifecycle.coroutineScope.launchWhenCreated {
    try {
        hubConnection = HubConnectionBuilder.create("baseurl")
            .build()

        // 先注册回调,再启动连接、执行订阅
        hubConnection.on("ReceiveSimplifiedRealTime", { response: String ->
            Log.e("Receive123**** ", response)
        }, String::class.java)

        // 启动连接并等待完成
        hubConnection.start().await()
        Log.e("123**** ", "Established connection......" + hubConnection.connectionId)

        val userID = "Model.user_id"
        // 等待订阅操作完成
        hubConnection.invoke(
            "Subscribe",
            hubConnection.connectionId,
            arrayListOf(
                userID,
                "$userID+_messaging",
                "$userID+_notification",
                "$userID+_setting",
                "$userID+_plan",
                "$userID+_refresh"
            )
        ).await()
    } catch (e: Exception) {
        Log.e("SignalR Error: ", e.toString())
    }
}

额外调试建议

  • 开启SignalR日志功能,查看消息接收细节:
    HubConnectionBuilder.create("baseurl")
        .setLogger(Logger.LogLevel.DEBUG)
        .build()
    
  • 监听连接状态变化,确认连接始终处于活跃状态:
    hubConnection.connectionState.observe(this) { state ->
        Log.e("Connection State: ", state.name)
    }
    
  • 验证服务器端推送的消息名称和参数类型是否与客户端完全匹配(SignalR方法名称区分大小写)。

内容的提问来源于stack exchange,提问作者Ayaz Muhammad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:55:42