2014-07-23 81 views
1

這一直困擾着我一段時間,任何幫助將不勝感激。與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中的錯誤。有人可以解釋爲什麼交換這些陳述會導致這種情況嗎?

在此先感謝。

回答

1

好的。所以我想通了。希望這可以幫助其他有類似問題的人。

通過首先掛接事件處理程序,我猜測有一些奇怪的上下文切換正在進行。

我所做的是通過初始調用設置單例實例:SignalRController.Instance.Setup(Activity activity),並在調用await Instance.Start()或掛接任何事件處理程序之前傳遞給調用活動的引用。然後我用activity.RunOnUiThread(()=>onConnectionStateChanged);包裝單身人士提出的所有事件。

感謝任何花時間閱讀本文的人。