【问题标题】:signalr on function not being called未调用函数上的信号器
【发布时间】:2016-09-03 03:54:38
【问题描述】:

我正在将 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 肯定已经启动并且连接成功。我可以使用调用来使用服务器功能。甚至 invoke("init") 也被确认可以正常工作。
  2. “请求”函数肯定被调用了。我已经检查了几种方法,包括使用 console.log 在 js 上创建等效代码。它与相同的过程完美配合。 hub.on('request', function(){console.log(99)})
  3. 我已尝试在其他地方运行 testFunction(),它运行良好。

我基本上已经对流程的每个部分进行了我能想到的所有可能的检查。我面临的问题是我的 testFunction() 在调用请求时永远不会运行。我试过用其他几个代码替换它。他们都没有跑。生成apk文件后,我在android studio模拟器和手机上进行了测试。根据我上面提到的测试,仍然没有调用 on 函数的可能原因是什么?

【问题讨论】:

  • 你能让它工作吗?我用新信息更新了我的答案。

标签: android signalr-hub signalr.client


【解决方案1】:

当您注册到集线器上的方法时,您的回调不会立即被调用。库首先处理它检索到的数据。如果发生错误,您的回调将不会被调用。这主要是因为反序列化失败了。

您可以将记录器附加到您的连接。这允许您记录有关请求的数据:

Logger logger = new Logger() {
                @Override
                public void log(String s, LogLevel logLevel) {
                    Timber.d("SignalR " + s);
                }
            };
connection = new HubConnection(host, "", true, logger);

您还可以将错误回调附加到您的连接。发生错误时您会收到通知。

connection.error(new ErrorCallback() {
                @Override
                public void onError(Throwable error) {
                    Log.e("signalRError",error);
                }
            });

我遇到的一些错误是:

如果返回 null,反序列化将失败。这发生在我身上,因为服务器发送回 null 以保持连接打开。 作为一种解决方法,我在 SignalR 客户端 SDK 的 StreamResponse 类的 readToEnd 方法中缓存了 NullPointerExceptionEndOfFileException

当我尝试将从 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 作为模块添加到我的项目中,以便于调试,并在必要时更改代码。由于上次提交几乎是两年前,并且该库似乎不再受支持。

【讨论】:

    【解决方案2】:

    就像@Rockney 所说的

    "当您注册到集线器上的方法时,您的回调不会得到 立即打电话。 "

    但是当您在正确的时间调用它时(在集线器代理准备好之后)。 对我来说是从

    改变方法

    hubProxy.on() ---> hubConnection.received()

    示例(在 kotlin 中)

    hubConnection?.received({ jsonElement ->
    
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多