2016-09-03 17 views
0

私はアンドロイドアプリケーションのためにsignalRクライアントJavaを使用しています。 次私は今のよう心掛けておりますコードです:シグナル機能が呼び出されない

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()elseを実行しようとしました。

私はプロセスのあらゆる部分について考えることができるすべての可能なチェックを基本的に行っています。私が直面している問題は、要求が呼び出されたときにtestFunction()が実行されないということです。私はいくつかの他のコードに置き換えようとしました。それらのどれも走らない。私はアンドロイドスタジオエミュレータとapkファイルを生成した後に電話でテストしました。上記のテストに基づいて、on関数がまだ呼び出されていない可能性がある理由は何か。

+0

は、あなたはそれが働いて得ることができましたか?私は新しい情報で私の答えを更新しました。 – Rockney

答えて

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が返送された場合

デシリアライズは失敗します。これは、サーバーが接続をオープンに保つためにヌルを送り返していたために私のために発生しました。 回避策として、私はStreamResponseクラスのreadToEndメソッドのNullPointerExceptionEndOfFileExceptionをSignalR client-SDKクラスにキャッシュしました。

APIメソッドから取得した日付を逆シリアル化してjava.sql.Dateにデシリアライズしても失敗しました。この問題のためにプルリカバリがありました。

リクエストメソッドが既にデータを返している場合、期待される型がSubscriptionHandlerに渡されないため、デシリアライズが失敗することがあります。あなたはSubscriptionHandlerClassAを渡しているとき

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

デシリアライズも失敗しますが、返される結果は、私がSignalR-クライアントSDKとSignalR-クライアント-SDK-のAndroidを追加ClassB

タイプのものであり、私のデバッグを容易にするモジュールとしてプロジェクトを作成し、必要に応じてコードを変更します。最後のコミットはほぼ2年前から行われており、ライブラリはもうサポートされていないようです。

0

@Rockneyは

「ハブの方法にあなたを登録すると、あなたのコールバックはすぐに呼ばれる を得ることはありません」

を言ったようにしかし、あなたは適切なタイミングでそれを呼び出したとき(ハブプロキシが準備された後)。私にとって は

hubProxy.on(からメソッドを変更しました)---> hubConnection.received()

例(kotlinに)

hubConnection?.received({ jsonElement -> 

}) 
関連する問題