Xamarin Android Finalizer wird nicht aufgerufen, wenn Sie die Aktivität verlassen, um zu einer anderen Aktivität zu wechseln

8

Der Finalizer wird nie nach dem Verlassen der Aktivität aufgerufen. Bedeutet das, dass die Aktivität noch am Leben ist, obwohl ich mit der nächsten Aktivität weitergemacht habe.

%Vor%     
QWill 04.03.2015, 19:22
quelle

1 Antwort

26

Das ist wirklich bemerkenswert kompliziert; Die kurze Antwort auf die noch lebende Aktivität ist Ja und Nein. Wenn Sie die Ressourcen für Ihre Activity korrekt bereinigt haben, wird Ihre Aktivität (eventuell) vom Garbage Collector bereinigt.

Was die Bereinigung angeht, ist es wichtig zu wissen, dass Xamarin entmutigt (ab 44) mit Finalizern. Hier ist warum:

  
  • Sie sind nicht garantiert, innerhalb einer Frist zu laufen.
  •   
  • Sie laufen nicht in einer bestimmten Reihenfolge.
  •   
  • Sie machen Objekte länger leben.
  •   
  • Der GC kennt keine nicht verwalteten Ressourcen.
  •   

Daher ist die Verwendung eines Finalizers zum Ausführen der Bereinigung die falsche Vorgehensweise ... Wenn Sie sicherstellen möchten, dass MainActivity zerstört ist, müssen Sie die Activity in ihrem OnDestroy -Rückruf manuell ablegen:

%Vor%

Dies führt dazu, dass Mono die Peer-Objekt Verbindung unterbricht und die Aktivität während des Spiels zerstört nächster Speicherbereinigungszyklus ( GC.Collect(GC.MaxGeneration) ). Aus der Dokumentation:

  

Um die Lebensdauer von Objekten zu verkürzen, sollte Java.Lang.Object.Dispose () aufgerufen werden. Dies wird die Verbindung auf dem Objekt zwischen den beiden VMs manuell "trennen", indem die globale Referenz freigegeben wird, wodurch die Objekte schneller gesammelt werden können.

Beachten Sie die Reihenfolge der Aufrufe, this.Dispose() muss nach genanntem Code sein, der in das Land von Android zurückkehrt. Warum? Alle Verbindungen zwischen Java und .NET sind nun unterbrochen, damit Android Ressourcen zurückgewinnen kann, so dass jeder Code, der Android-Land-Objekte (Fragment, Aktivität, Adapter) verwendet, fehlschlägt.

Nun zu einigen Debugging-Techniken für Aktivitätslecks. Um sicherzustellen, dass Ihre Aktivität bereinigt wird, fügen Sie der Methode OnCreate Ihres Apps-Eintrags Activity :

den folgenden Code hinzu %Vor%

Dies ermöglicht StrictMode , ein nützliches Debugging-Tool, das Sie gerne informiert, wenn Sie leaved Ressourcen. Wenn eine Ihrer Apps-Aktivitäten nicht korrekt freigegeben wird, wird so etwas in den Ausgabestrom ausgegeben:

%Vor%

Wenn Sie dies mit dem Aufruf Dispose() kombinieren, können Sie prüfen, ob Aktivitäten freigegeben werden. Hier ist, wie Sie normalerweise ein Activity und seine Ressourcen in Xamarin.Android:

%Vor%     
matthewrdev 05.03.2015, 01:46
quelle

Tags und Links