2016-09-03 3 views
0

J'utilise le client signalR java pour une application android. Ce qui suit est le code que je suis en train dès maintenant:signalr sur la fonction non appelée

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

Les éléments suivants sont testés et vérifiés comme travail:

  1. Le Conn a sûrement commencé et la connexion est réussie. Je suis capable d'utiliser les fonctions de serveur en utilisant invoke. Même l'appel ("init") est confirmé pour fonctionner.
  2. La fonction "request" est définitivement appelée. J'ai vérifié de plusieurs manières comprenant en créant un code équivalent sur js avec un console.log. Cela fonctionne parfaitement avec le même processus. hub.on('request', function(){console.log(99)})
  3. J'ai essayé d'exécuter testFunction() else où et cela fonctionne parfaitement.

J'ai essentiellement fait toutes les vérifications possibles auxquelles je pouvais penser à chaque étape du processus. Le problème que je suis confronté est que j'ai le testFunction() ne s'exécute jamais lorsque la demande est appelée. J'ai essayé de le remplacer par plusieurs autres codes. Aucun d'eux ne court. J'ai testé sur l'émulateur de studio android et sur le téléphone après avoir généré un fichier apk. Sur la base de mes tests mentionnés ci-dessus, quelles pourraient être les raisons possibles pour lesquelles la fonction On n'est toujours pas appelée?

+0

Avez-vous pu le faire fonctionner? J'ai mis à jour ma réponse avec de nouvelles informations. – Rockney

Répondre

1

Lorsque vous vous enregistrez sur une méthode sur un concentrateur, votre rappel n'est pas immédiatement appelé. La bibliothèque traite d'abord les données qu'elle récupère. Si une erreur se produit, votre rappel ne sera pas appelé. C'est principalement parce que la désérialisation échoue.

Vous pouvez connecter un enregistreur à votre connexion. Cela vous permet de consigner des données sur les demandes:

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

Vous pouvez également joindre un message d'erreur à votre connexion. Vous êtes averti lorsqu'une erreur est survenue.

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

Quelques erreurs que je rencontrais étaient les suivants:

Désérialisation échouerait si nul a été renvoyé. Cela s'est produit pour moi parce que le serveur renvoyait null pour garder la connexion ouverte. En guise de solution de contournement, j'ai mis en cache NullPointerException et EndOfFileException dans la méthode readToEnd dans la classe StreamResponse dans le client SDK SignalR.

La désérialisation a également échoué pour moi, lorsque j'ai essayé de désérialiser une date extraite d'une méthode API vers un java.sql.Date. Il y a eu une demande pour cette question.

Dans votre cas, si la méthode de demande renvoie déjà des données, la désérialisation peut échouer car le type attendu n'est pas transmis au SubscriptionHandler.

hubProxy.on("request", new SubscriptionHandler1<Object>() { 
    @Override 
    public void run(Object object) { 
     testFunction(); 
    } 
}); 

Désérialisation également échouer lorsque vous passez ClassA à votre SubscriptionHandler mais le résultat renvoyé est de type ClassB

J'ai ajouté le SignalR-client-SDK et le SignalR-client-SDK Android à mon projeter en tant que modules pour faciliter le débogage et modifier le code si nécessaire. Depuis le dernier commit il y a presque deux ans, la bibliothèque ne semble plus supporter.

0

Comme @Rockney dit

« Lorsque vous vous inscrivez à une méthode sur un concentrateur, votre rappel ne soit pas appelé immédiatement. »

Mais quand vous l'avez appelé dans le temps droit (après que le proxy du concentrateur est prêt). pour moi était de changer de méthode de

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

exemple (en Kotlin)

hubConnection?.received({ jsonElement -> 

})