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
相关产品推荐
相关产品推荐

