這一直困擾着我一段時間,任何幫助將不勝感激。與Android的SignalR連接線程
我在可移植類庫中使用Xamarin.Android與SignalR客戶端來創建消息傳遞應用程序。本質上,我有兩個類在我的Android層:用於UI的一個片段和一個控制SignalR連接(SignalRContoller,一個單例)的類,它啓動/停止signalR連接並將消息傳遞到用戶界面和從用戶界面傳遞消息。這裏是連接是如何在片段進行處理,截至目前:
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;
}
這工作得很好,不會引發任何異常。但是,這等待,直到信號R連接已經開始之前,掛鉤我的事件處理程序,這意味着我不能顯示任何更新,讓用戶知道連接正在連接,或重新連接等。
因此,我迷上了調用start之前的事件處理程序:
...
SignalRController.Instance.ConnectionStateChanged += onConnectionStateChange;
await SignalRController.Instance.Start();
...
通過交換這些語句的順序,我得到一個JavaRuntimeException
試圖從signalR有消息稱connection.start()時: "Can't create handler inside thread that has not called Looper.prepare()"
這是怎樣的單實例正在從t返回他SignalRController:
public static SignalRController Instance
{
get
{
lock (instanceLock)
{
if (instance == null)
{
instance = new SignalRController();
}
return instance;
}
}
}
由於這是類似於試圖更新從非UI線程我試圖爲在xamarin論壇here,但沒有運氣由JP介紹的幾種方法UI中的錯誤。有人可以解釋爲什麼交換這些陳述會導致這種情況嗎?
在此先感謝。