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はサービスでこれを(Activity OnStartおよびOnResumeフックを介して)追跡しIMvxAndroidCurrentTopActivity
ます-しかし、フォアグラウンドアクティビティが常に実行されるという保証はありません-例:コードがMvvmCross以外のアクティビティをロードする場合、明らかにMvvmCrossはこれらのアクティビティを認識しません。
ディスパッチャへの参照を保持するべきではありません-保持する場合は、Androidアクティビティを自然な存続期間を超えてメモリに保持している可能性があります
DoStuff
拡張メソッドにも入れることができると思います-おそらくv3に追加します( https://github.com/slodge/MvvmCross/issues/150)