SignalR连接线程与Android

本文关键字:Android 线程 连接线 连接 SignalR | 更新日期: 2023-09-27 18:14:37

这个问题让我困惑了一段时间,如果有任何帮助,我将不胜感激。

我正在使用Xamarin。Android在可移植类库中使用SignalR客户端来创建消息传递应用。

本质上,我有两个类在我的Android层:一个片段的UI和一个类,控制SignalR连接(signalrcontroller,一个单例),启动/停止SignalR连接和传递消息到和从UI。以下是到目前为止在片段中如何处理连接的:

public override async void OnResume()
{
    base.OnResume();
    //Do some startup stuff
    if (!SignalRController.IsRunning)
    {
        try
        {
            await SignalRController.Instance.Start();
        }
        catch (Exception ex)
        {
            Toast.MakeText(Activity, "error", ToastLength.Short).Show();
        }
    }
   SignalRController.Instance.ConnectionStateChanged += onConnectionStateChange;
}

这很好,不会抛出任何异常。然而,这要等到signalR连接开始之后,然后再连接我的事件处理程序,这意味着我不能显示任何更新,让用户知道连接正在连接,或重新连接等。

所以我在调用start: 之前连接了事件处理程序
...
SignalRController.Instance.ConnectionStateChanged += onConnectionStateChange;
await SignalRController.Instance.Start();
...

通过交换这些语句的顺序,当尝试从signalR调用connection.start()时,我得到一个JavaRuntimeException:"Can't create handler inside thread that has not called Looper.prepare()"

这是singleton实例从SignalRController返回的方式:

public static SignalRController Instance
{
    get
    {
        lock (instanceLock)
        {
            if (instance == null)
            {
                instance = new SignalRController();
            }
            return instance;
        }
    }
}

由于这类似于试图从非UI线程更新UI的错误,我尝试了JP在xamarin论坛上描述的几种方法,但没有运气。有人能解释一下为什么这些语句的交换会导致这种情况吗?

SignalR连接线程与Android

好的。我已经算出来了。希望这能帮助到有类似问题的人。

通过首先连接事件处理程序,我猜有一些奇怪的上下文切换正在进行。

我所做的是用初始调用设置单例实例:SignalRController.Instance.Setup(Activity activity),并在调用await Instance.Start()或连接任何事件处理程序之前传递对调用活动的引用。然后我用activity.RunOnUiThread(()=>onConnectionStateChanged);包装由单例引发的所有事件。

感谢所有花时间阅读这篇文章的人