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论坛上描述的几种方法,但没有运气。有人能解释一下为什么这些语句的交换会导致这种情况吗?
好的。我已经算出来了。希望这能帮助到有类似问题的人。
通过首先连接事件处理程序,我猜有一些奇怪的上下文切换正在进行。
我所做的是用初始调用设置单例实例:SignalRController.Instance.Setup(Activity activity)
,并在调用await Instance.Start()
或连接任何事件处理程序之前传递对调用活动的引用。然后我用activity.RunOnUiThread(()=>onConnectionStateChanged);
包装由单例引发的所有事件。
感谢所有花时间阅读这篇文章的人