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

Java/Android版SignalR Client:Invoke回调始终未触发

SignalR Android客户端调用C# Hub无法获取Invoke返回值的解决方法

你的问题出在服务器端和客户端的调用模式不匹配:

问题根源

你当前的C# Hub方法用Clients.Caller.SendAsync主动推送消息给客户端,这属于服务器主动触发的事件推送,对应的是客户端用on方法监听;而客户端用的invoke是请求-响应模式,要求服务器端方法直接返回数据,而非主动推送。

修正方案

1. 修改C# Hub方法

把GetActiveAlarms改成返回对应数据类型的Task<T>,SignalR会自动把返回值传递给客户端的invoke调用:

// 假设Program.activeAlarms是List<Alarm>类型,根据实际类型调整返回值
public async Task<List<Alarm>> GetActiveAlarms()
{
    Console.WriteLine("GetActiveAlarms Called");
    // 如果有异步操作(比如从数据库读取),这里加await;无异步逻辑直接返回即可
    return Program.activeAlarms;
}

2. 调整Android客户端代码

此时invoke就能正确获取返回值,doOnComplete和doOnSuccess都会触发:

hubConnection.invoke("GetActiveAlarms")
    .doOnSuccess(alarms -> {
        // 在这里处理返回的告警列表,加载RecyclerView
        loadRecyclerViewData((List<Alarm>) alarms);
    })
    .doOnComplete(() -> {
        // 现在会正常被调用
    })
    .blockingAwait();

补充说明

如果坚持要用原服务器端的SendAsync推送方式,客户端无需调用invoke,直接通过on监听事件即可:

// 在Hub连接建立后注册监听
hubConnection.on("GetActiveAlarms", (alarms) -> {
    // 处理推送过来的告警数据
    loadRecyclerViewData((List<Alarm>) alarms);
}, List.class);

// 然后调用Hub方法触发推送(此时服务器端方法保持原Task类型即可)
hubConnection.send("GetActiveAlarms").blockingAwait();

但对于启动时主动获取初始数据的场景,请求-响应模式(invoke+返回Task)更符合逻辑,代码流程也更清晰。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:45:49