函数未被调用的信号器

时间:2016-09-03 03:54:39

标签: android signalr-hub signalr.client

我正在使用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");
    }
});

以下测试和验证工作正常:

  1. conn肯定已经开始并且连接成功。我可以使用调用来使用服务器功能。甚至调用(&#34; init&#34;)也被证实有效。
  2. &#34;请求&#34;功能肯定被称为。我已经检查了几种方法,包括使用console.log在js上创建等效代码。它与同一个过程完美配合。 hub.on('request', function(){console.log(99)})
  3. 我尝试过运行testFunction()else,并且它完美运行。
  4. 我基本上已经完成了我能想到的每个可能的检查过程的每个部分。我面临的问题是我在调用请求时从不运行testFunction()。我试过用其他几个代码替换它。他们都没有跑。我在生成apk文件后在android studio模拟器和手机上测试过。基于我上面提到的测试,为什么仍然没有调用on函数的可能原因是什么?

2 个答案:

答案 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方法中缓存了readToEndStreamResponse

当我尝试将从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 ->

})