2016-07-02 5 views
0

リアルタイムチャットの目的でSignalRを使用するXamarinのAndroidアプリを構築しています。私はそれを切断した後、再起動すると、サーバーに接続しようとするとアプリケーションがクラッシュし、正常に接続します。 私のソリューション全体で同じ参照に使用されているシングルトンクラスを持っています。以下に示すように、接続がアプリのMainActivityに開始されSignalRサーバに接続しようとするとアプリケーションがクラッシュする

public void StopConnection() 
    { 
     hubConnection.Stop(); 

    } 

public async Task<string> StartConnection() 
    { 
     hubConnection.Headers.Add("User-Agent", "mobile"); 
     hubConnection.Headers.Add("username", loggedUser); 
     try 
     { 
      await hubConnection.Start(); 
      return "Connected.."; 
     } 
     catch (Exception e) 
     { 
      return e.Message; 
     } 

    } 

次のメソッドは、接続を切断:シングルトンクラスは、サーバーに接続するには、次の方法があります

 Task.Factory.StartNew(async() => 
     { 
      await SignalRClientHelper.StartConnection(); 
      SignalRClientHelper.InvokeGetPendingConversations(loggedonuser.UserName); 

     }); 

ユーザがログアウトしたとき、以下に示すように、接続が切断された:

SignalRClientHelper.StopConnection(); 

クライアントは問題なく初めてsignalRサーバーに接続できますが、ログアウトして再びアプリケーションにログインすると、2回目のサーバーへの接続時にアプリケーションがクラッシュします。ここ はエラーログです:

ava.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:511) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980) 
    ... 2 more 
Caused by: md52ce486a14f4bcd95899665e9d932190b.JavaProxyThrowable: System.InvalidOperationException: Data cannot be sent because the connection is in the disconnected state. Call start before sending any data. 
    at Microsoft.AspNet.SignalR.Client.Connection.Send (System.String data) [0x0001e] in <filename unknown>:0 
    at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[TResult,TProgress] (System.String method, System.Action`1 onProgress, System.Object[] args) [0x000e1] in <filename unknown>:0 
    at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[T] (System.String method, System.Object[] args) [0x00000] in <filename unknown>:0 
    at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke (System.String method, System.Object[] args) [0x00000] in <filename unknown>:0 
    at Yourtime.SignalRClientHelper+<InvokeSendMessage>d__11.MoveNext() [0x0000d] in <filename unknown>:0 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in <filename unknown>:0 
    at System.Runtime.CompilerServices.AsyncMethodBuilderCore.<ThrowAsync>m__0 (System.Object state) [0x00000] in <filename unknown>:0 
    at Android.App.SyncContext+<Post>c__AnonStorey0.<>m__0() [0x00000] in <filename unknown>:0 
    at Java.Lang.Thread+RunnableImplementor.Run() [0x0000b] in <filename unknown>:0 
    at Java.Lang.IRunnableInvoker.n_Run (IntPtr jnienv, IntPtr native__this) [0x00009] in <filename unknown>:0 
    at (wrapper dynamic-method) System.Object:44f67f43-349f-4a1b-8234-1604bc812b68 (intptr,intptr) 
    at mono.java.lang.RunnableImplementor.n_run(Native Method) 
    at mono.java.lang.RunnableImplementor.run(RunnableImplementor.java:29) 
    at android.os.Handler.handleCallback(Handler.java:605) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:137) 
    at android.app.ActivityThread.main(ActivityThread.java:4511) 

誰もがここで間違っているかもしれないものの任意のアイデアを持っていますか?

答えて

1

SignalRの切断はIMGのバグですが、切断状態のときに何かを呼び出そうとしているというエラーが表示されます。

私はあなたが次のように接続/切断方法を変更勧め:

外し

var connectionToDispose = _connection; // _connection is the current connection 
_connection = null; 
_proxy = null; 

// connection disposing can block the UI thread for about 20 seconds 
// this doesn´t always happen but just in case we run it on a new thread 
Task.Run(() => 
{ 
    try 
    { 
     connectionToDispose.Dispose(); 
    } 
    catch (Exception ex) 
    { 
     _tracer?.WriteLine($"[{_className}] Connection could not be disposed: {ex.Message}"); 
    } 
}); 

接続

if (_connection != null) 
{ 
    return false; 
} 

// always create a new Hub 
_connection = new HubConnection(_endpointUri); 
// TODO add headers 
// TODO create proxy again and subscribe to server events (proxy.On...), etc 

try 
{ 
    _tracer?.WriteLine($"[{_className}] CONNECTING..."); 
    await _connection.Start(); 

    return true; 
} 
catch (Exception ex) 
{ 
    _tracer?.WriteLine($"[{_className}] CONNECTION START ERROR: {ex.Message}"); 
    return false; 
} 

ただ、参考のために、これを見てくださいclass。私は何の問題もなく何度も接続/切断するアプリで使ってきました。あなたはそれからいくつかのアイデアを取ることができます。

+0

いつものように、私はあなたの答えに本当に感謝しています。 gitへのリンクを提供してくれてありがとう。私は実際には動作しているソリューションを見たいと思っていましたが、何も見つかりませんでした。 –

+0

@Xleon:Android用の実装はありますか?私は同じ問題に直面しています。 – Chetna

+0

あなたはJavaを意味しますか?いいえ、コンセプトは本当にシンプルです。 Androidでこのコードを簡単に書き換えることができるはずです – xleon

関連する問題