獲得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)
這仍然是最新的? – tofutim 2014-03-06 23:45:00
從MvxMainThreadDispatchingObject繼承我的工作(在我的MvvmCross插件之一的iOS中)。 – 2015-06-22 15:01:11
你能提供一個關於如何調用DoStuff函數的例子嗎?例如,顯示加載順序。謝謝。 – Ph0b0x 2017-06-29 17:39:43