2013-02-12 10 views
8

Messengerプラグインを機能拡張しています。これにより、バックグラウンドスレッドで起こっていることではなく、メインスレッドでメッセージを渡すことができます。MvvmCross:プラグインでInvokeOnMainThreadを使用する

BaseSubscriptionboolに拡張しました。このサブスクリプションをメインスレッドでメッセージにする必要があることを知りました。今私はサブスクリプションの実際の実装で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); 
    } 
} 

望ましい場合には(あなたがIMvxServiceConsumerを使用しない場合)GetService<T>()静的メソッドは、静的メソッドとして呼び出すことができます。


注:

  • あなたは「アプリ」と「サービス」/「BackgroundAgents」あなたはエラー条件をチェックするのは非常に注意する必要があるとのコード共有している場合 - 常に存在ではありませんが利用可能なUIスレッド。

  • Androidは特に特別なものです - UIスレッドはだけは本当に現在の前景の活動を介してアクセスすることができます - 現在MvvmCrossはIMvxAndroidCurrentTopActivityサービスに(活動のOnStartとOnResumeフックを経由して)これを追跡する - しかし、あなたは常に持っているという保証はありませんフォアグラウンド活動を実行中 - 例えばあなたのコードが非MvvmCrossアクティビティを読み込むと、明らかにMvvmCrossはこれらについて知りません。

  • あなたは、ディスパッチャへの参照を保持べきではない - あなたは、あなたが彼らの自然な寿命

  • を超えるメモリにAndroidのアクティビティのを保持することができるかどうかはDoStuffがあまりにも拡張メソッドに入れることがことができると思います - おそらくそれをv3に追加します(https://github.com/slodge/MvvmCross/issues/150

+0

これはまだ最新ですか? – tofutim

+1

MvxMainThreadDispatchingObjectから継承することで、私のための治療(私のMvvmCrossプラグインのiOSで)ができました。 –

+0

DoStuff関数を呼び出す方法の例を教えてください。たとえば、ロードシーケンスを表示する。ありがとう。 – Ph0b0x

関連する問題