8

私はMessengerプラグインを機能で拡張しています。これにより、バックグラウンドスレッドで発生するすべてのメッセージではなく、メインスレッドでメッセージを渡すことができるようになります。

このサブスクリプションをメインスレッドでメッセージ送信する必要があることを知って、拡張BaseSubscriptionしました。ここで、サブスクリプションの実際の実装のメソッドからbool使​​用できるようにする必要があります。InvokeOnMainThreadTypedInvoke

参照されているMvvmCrossアセンブリを見るとCirrious.MvvmCross.ViewModels.MvxMainThreadDispatchingObject、メソッドが含まれているInvokeOnMainThreadことがわかります。問題は、メソッドを呼び出すことができるように、そのオブジェクトをどのように取得するかです。

4

1 に答える 1

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はサービスでこれを(Activity OnStartおよびOnResumeフックを介して)追跡しIMvxAndroidCurrentTopActivityます-しかし、フォアグラウンドアクティビティが常に実行されるという保証はありません-例:コードがMvvmCross以外のアクティビティをロードする場合、明らかにMvvmCrossはこれらのアクティビティを認識しません。

  • ディスパッチャへの参照を保持するべきではありません-保持する場合は、Androidアクティビティを自然な存続期間を超えてメモリに保持している可能性があります

  • DoStuff拡張メソッドにも入れることができると思います-おそらくv3に追加します( https://github.com/slodge/MvvmCross/issues/150

于 2013-02-12T10:26:38.633 に答える