Сигнализатор на функцию не вызывается

Я использую JavaR-клиент 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. Коннект наверняка запущен, и соединение установлено успешно. Я могу использовать разорвать функции, используя invoke. Даже invoke("init") подтверждается, что работает.
  2. Функция "запрос" определенно вызывается. Я проверил несколькими способами, включая создание эквивалентного кода на js с console.log. Он отлично работает с тем же процессом.hub.on('request', function(){console.log(99)})
  3. Я попытался запустить testFunction() еще где и он работает отлично.

Я в основном сделал все возможные проверки, которые я мог придумать в каждой части процесса. Проблема, с которой я сталкиваюсь, заключается в том, что у меня testFunction() никогда не запускается при вызове запроса. Я попытался заменить его несколькими другими кодами. Никто из них не бежит. Я протестировал на эмуляторе android studio и на телефоне после генерации apk-файла. Основываясь на моих тестах, упомянутых выше, что может быть причиной того, что функция on по-прежнему не вызывается?

2 ответа

Когда вы регистрируетесь в методе на концентраторе, ваш обратный вызов вызывается не сразу. Библиотека сначала обрабатывает данные, которые она получает. Если произойдет ошибка, ваш обратный вызов не будет вызван. Это происходит главным образом потому, что десериализация терпит неудачу.

Вы можете прикрепить регистратор к вашему соединению. Это позволяет вам регистрировать данные о запросах:

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);
                }
            });

Я обнаружил несколько ошибок:

Десериализация потерпит неудачу, если ноль будет отправлен обратно. Это произошло для меня, потому что сервер отправлял обратно ноль, чтобы держать соединение открытым. В качестве обходного пути я кешировал NullPointerException а также EndOfFileException в readToEnd метод в StreamResponse класс в SignalR клиент-SDK.

Десериализация также не удалась для меня, когда я попытался десериализовать дату, полученную из метода 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 в свой проект в качестве модулей, чтобы упростить отладку и, при необходимости, изменить код. Так как последний коммит был почти два года назад, и библиотека больше не поддерживается.

Как сказал @Rockney

"Когда вы регистрируетесь в методе на концентраторе, ваш обратный вызов вызывается не сразу".

Но когда вы позвонили в нужное время (после того, как хаб-прокси готов). Для меня было изменить метод из

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

пример (в котлине)

hubConnection?.received({ jsonElement ->

})
Другие вопросы по тегам