Ich erweitere das Messenger-Plugin um Funktionen, die es ermöglichen, Nachrichten im Hauptthread zu übergeben, statt alles, was in einem Hintergrundthread passiert.
Ich habe BaseSubscription
mit einem bool
erweitert, um zu wissen, dass dieses Abonnement im Hauptthread gemeldet werden muss. Jetzt muss ich InvokeOnMainThread
von den TypedInvoke
-Methoden in den tatsächlichen Implementierungen der Subskriptionen verwenden können.
Wenn ich in der referenzierten MvvmCross-Assembly nachschaue, sehe ich, dass Cirrious.MvvmCross.ViewModels.MvxMainThreadDispatchingObject
die Methode InvokeOnMainThread
enthält, also stellt sich die Frage, wie ich das Objekt erhalte, damit ich die Methode aufrufen kann?
Der UI-Thread kann am einfachsten über MvxMainThreadDispatchingObject
Wenn die Hierarchie Sie nicht lässt, dann ist der nächste einfachste Weg, die IMvxServiceConsumer
marker Schnittstelle hinzuzufügen und dann die GetService<T>
Erweiterungsmethode zu verwenden:
Die statische Methode GetService<T>()
könnte auch als statische Methode aufgerufen werden, wenn sie bevorzugt wird (wenn Sie IMvxServiceConsumer
nicht verwenden möchten).
Anmerkungen:
Wenn Sie Code zwischen "Apps" und "Services" / "BackgroundAgents" freigeben, müssen Sie sehr vorsichtig sein, um nach Fehlerzuständen zu suchen - es ist nicht immer ein UI-Thread verfügbar.
Android ist besonders - der UI-Thread kann nur über die aktuelle Vordergrundaktivität erreicht werden - derzeit verfolgt MvvmCross dies (über Activity OnStart und OnResume-Hooks) im IMvxAndroidCurrentTopActivity
-Dienst - aber es gibt keine Garantie dafür wird immer eine Vordergrundaktivität ausführen - z Wenn Ihr Code jemals Nicht-MvvmCross-Aktivitäten lädt, wird MvvmCross davon natürlich nichts wissen.
Sie sollten die Verweise auf den Dispatcher nicht beibehalten. Wenn Sie dies tun, halten Sie Android Activities möglicherweise über ihre natürliche Lebensdauer hinaus im Speicher.
Ich denke, DoStuff
könnte auch in eine Erweiterungsmethode eingefügt werden - vielleicht füge ich das in v3 hinzu ( Ссылка )
Tags und Links c# multithreading xamarin.ios xamarin.android mvvmcross