MvvmCross: Verwenden von InvokeOnMainThread im Plugin

8

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?

    
Cheesebaron 12.02.2013, 10:17
quelle

1 Antwort

5

Der UI-Thread kann am einfachsten über MvxMainThreadDispatchingObject

erben werden

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:

%Vor%

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 ( Ссылка )

Stuart 12.02.2013, 10:26
quelle