【问题标题】:App crashes when trying to connect to SignalR server after disconnecting it断开连接后尝试连接到 SignalR 服务器时应用程序崩溃
【发布时间】:2016-07-02 08:17:24
【问题描述】:

我正在构建一个 Xamarin Android 应用程序,它使用 SignalR 进行实时聊天。当我断开连接后尝试再次连接到服务器时,应用程序崩溃,当应用程序重新启动时,它连接正常。 我有一个单例类,在我的解决方案中用于相同的引用。单例类有如下方法连接服务器:

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

    }

以下方法断开连接:

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

    }

连接在应用的MainActivity中启动,如下图所示:

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

        });

用户退出时连接断开,如下图:

SignalRClientHelper.StopConnection();

客户端第一次可以连接到signalR服务器没有任何问题,但是当他们注销并再次登录应用程序时,应用程序在尝试第二次服务器时崩溃。 这是错误日志:

    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)

有人知道这里可能出了什么问题吗?

【问题讨论】:

    标签: android xamarin signalr


    【解决方案1】:

    SignalR 断开连接有点错误 IMO,但您的错误清楚地表明您正在尝试在断开连接状态下调用某些东西。

    我建议你改变你连接/断开的方式如下:

    断开连接

    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。我在一个应用程序中使用过多次连接/断开连接没有问题。您可以从中获得一些想法。

    【讨论】:

    • 一如既往,非常感谢您的回答。也非常感谢您提供指向您的 git 的链接。我真的很想看看可行的解决方案,但找不到任何东西。
    • @Xleon:你们有安卓的实现吗?我也面临同样的问题。
    • 你是指Java吗?不,但这个概念非常简单。您应该能够在 Android 中轻松重写此代码
    猜你喜欢
    • 2023-03-04
    • 2020-03-06
    • 2018-11-17
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多