2013-02-12 36 views
8

我正在使用功能來擴展Messenger插件,這將使得在主線程上傳遞消息成爲可能,而不是在後臺線程上發生的所有事情。MvvmCross:在插件中使用InvokeOnMainThread

我已將BaseSubscription擴展爲bool,以瞭解此訂閱需要在主線程中發送消息。現在我需要能夠在訂閱的實際實現中使用TypedInvoke方法中的InvokeOnMainThread

當我在引用的MvvmCross程序集中看到Cirrious.MvvmCross.ViewModels.MvxMainThreadDispatchingObject包含InvokeOnMainThread方法時,所以問題是如何獲取該對象以便可以調用該方法?

回答

5

獲得UI線程保持最簡單的方法是從MvxMainThreadDispatchingObject

如果繼承層次結構不會讓你,那麼下一個最簡單的方法是添加IMvxServiceConsumer標記接口,並再使用GetService<T>擴展方法:

public class MyClass 
    : MyBaseClass 
    , IMvxServiceConsumer 
{ 
    // ... 

    private bool DoStuff(Action stuff) 
    { 
     var dispatcherProvider = this.GetService<IMvxMainThreadDispatcherProvider>(); 
     var dispatcher = dispatcherProvider.Dispatcher; 
     if (dispatcher == null) { 
      return false; 
     } 

     return dispatcher.RequestMainThreadAction(action); 
    } 
} 

如果首選GetService<T>()靜態方法也可以援引作爲一個靜態方法(如果你不希望使用IMvxServiceConsumer)。


注:

  • 如果您共享之間的「應用」和「服務」 /「BackgroundAgents」你需要非常小心地檢查錯誤條件碼 - 沒有永遠一個可用的UI線程。

  • Android是尤爲特別 - UI線程真的只能可以通過當前的前景活動訪問 - 目前MvvmCross跟蹤這(通過活動的OnStart和的onResume鉤子)在IMvxAndroidCurrentTopActivity服務 - 但有沒有保證,你將永遠有運行的前臺活動 - 例如如果你的代碼加載非MvvmCross活動,那麼顯然MvvmCross不會知道這些。

  • 你不應該繼續保留到Dispatcher引用 - 如果你這樣做,那麼你可能會拿着安卓活動在超出其自然壽命

  • 我想DoStuff內存可以被放入擴展方法太 - 也許我會補充說,在V3(https://github.com/slodge/MvvmCross/issues/150

+0

這仍然是最新的? – tofutim 2014-03-06 23:45:00

+1

從MvxMainThreadDispatchingObject繼承我的工作(在我的MvvmCross插件之一的iOS中)。 – 2015-06-22 15:01:11

+0

你能提供一個關於如何調用DoStuff函數的例子嗎?例如,顯示加載順序。謝謝。 – Ph0b0x 2017-06-29 17:39:43