我正在使用signalR客户端java作为Android应用程序。 以下是我现在尝试的代码:
conn = new HubConnection("http://example.com/");
hubProxy = conn.createHubProxy("android");
hubProxy.on("request", new SubscriptionHandler() {
@Override
public void run() {
testFunction();
}
});
conn.start().done(new Action<Void>() {
@Override
public void run(Void obj) throws Exception {
hubProxy.invoke("init");
}
});
以下测试和验证工作正常:
hub.on('request', function(){console.log(99)})
我基本上已经完成了我能想到的每个可能的检查过程的每个部分。我面临的问题是我在调用请求时从不运行testFunction()。我试过用其他几个代码替换它。他们都没有跑。我在生成apk文件后在android studio模拟器和手机上测试过。基于我上面提到的测试,为什么仍然没有调用on函数的可能原因是什么?
答案 0 :(得分:1)
当您注册集线器上的方法时,不会立即调用您的回调。该库首先处理它检索的数据。如果发生错误,则不会调用您的回调。这主要是因为反序列化失败了。
您可以将记录器附加到您的连接。这允许您记录有关请求的数据:
Logger logger = new Logger() {
@Override
public void log(String s, LogLevel logLevel) {
Timber.d("SignalR " + s);
}
};
connection = new HubConnection(host, "", true, logger);
您还可以将errorcallback附加到您的连接。发生错误时会收到通知。
connection.error(new ErrorCallback() {
@Override
public void onError(Throwable error) {
Log.e("signalRError",error);
}
});
我遇到的一些错误是:
如果返回null,则反序列化将失败。这对我来说是因为服务器发送回null以保持连接打开。
作为一种解决方法,我在SignalR client-SDK的NullPointerException
类的EndOfFileException
方法中缓存了readToEnd
和StreamResponse
。
当我尝试将从API方法检索到的日期反序列化为java.sql.Date
时,反序列化对我来说也失败了。这个问题有一个拉动请求。
如果请求方法已经返回数据,则反序列化可能会失败,因为预期的类型不会传递给SubscriptionHandler
。
hubProxy.on("request", new SubscriptionHandler1<Object>() {
@Override
public void run(Object object) {
testFunction();
}
});
将ClassA
传递给SubscriptionHandler
但返回的结果类型为ClassB
时,反序列化也会失败
我将SignalR-client-SDK和SignalR-client-SDK-Android作为模块添加到我的项目中,以便于调试,并在必要时更改代码。自上次提交大约两年以来,该库似乎不再受支持了。
答案 1 :(得分:0)
就像@Rockney所说的
“当您在集线器上注册方法时,您的回调无法获得 立即打电话。 “
但是当你在正确的时间(在集线器代理准备好之后)调用它时。 对我来说是改变方法
hubProxy.on()---&gt; hubConnection.received()
例子(在kotlin中)
hubConnection?.received({ jsonElement ->
})