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

