Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Hoe zorgt MVVMCross voor afvalinzameling voor evenementenabonnementen


Hoe zorgt MVVMCross voor afvalinzameling voor evenementenabonnementen


MVVMCross zorgt voor afvalinzameling voor evenementenabonnementen, voornamelijk door het gebruik van zwakke referenties. Hier is een gedetailleerde uitleg over hoe het werkt:

Overzicht van MVVMCross Messenger

De MVVMCross Messenger -plug -in is ontworpen om de aggregatie van het evenement tussen componenten te vergemakkelijken. Hiermee kunnen componenten communiceren door te publiceren en te abonneren op berichten. De boodschapper gebruikt zwakke referenties voor gebeurtenisabonnementen, die helpt bij het voorkomen van geheugenlekken door de afvalcollector toe te staan ​​objecten te verwijderen waarnaar niet langer wordt verwezen.

Zwakke referenties in mvvmcross

Wanneer u zich abonneert op een bericht met behulp van de MVVMCross Messenger, kunt u opgeven of u een zwakke of sterke referentie gebruikt. Standaard gebruikt MVVMCross zwakke referenties (`mvxReference.Weak`) voor abonnementen. Dit betekent dat de boodschapper geen sterke verwijzing naar de callback -methode heeft, waardoor de afvalverzamelaar het abonnement kan verwijderen als het geabonneerde object uit de reikwijdte komt.

Abonnement en niet -subscriptie

Abonnementen kunnen worden beheerd met behulp van verschillende methoden:
- Abonneren: berichten worden rechtstreeks op de publicatiethread doorgegeven.
- SubcribeonMainthread: berichten worden naar de hoofd UI -thread gericht.
- Subcureeonthreadpoolthread: berichten worden in de wachtrij geplaatst voor de verwerking van thread pool.

Elke abonnementsmethode retourneert een `mvxsubscriptionToken`, die kan worden gebruikt om zich af te schrijven bij het bericht. Als het token echter niet wordt opgeslagen, kan het abonnement afval worden verzameld.

Garbage Collection -mechanisme

Het mechanisme voor het verzamelen van afval in MVVMCross is gebaseerd op de `mvxsubscriptionToken` die afval is verzameld wanneer het uit de reikwijdte komt. Als een abonnementstoken niet wordt opgeslagen, komt het in aanmerking voor afvalinzameling, wat kan leiden tot het afmelden van de evenementenhandler. Deze aanpak zorgt ervoor dat objecten niet onnodig in het geheugen worden bewaard vanwege evenementabonnementen.

STATUS OVERSCHRIJVEN

MVVMCross biedt ook methoden om de huidige abonnementstatus te observeren, zoals `hassubscriptions for` en` tellsubscriptions for`. Bovendien publiceert de Messenger `MVXSubScriCerChangeMessage` -berichten wanneer abonnementen worden toegevoegd, verwijderd of vervallen, waardoor componenten hun gedrag kunnen aanpassen op basis van de huidige abonnementstoestand.

Best practices voor geheugenbeheer

Om een ​​effectieve afvalinzameling te garanderen en geheugenlekken te voorkomen:
- Gebruik waar mogelijk zwakke referenties voor gebeurtenisabonnementen.
- Bewaar abonnementstokens als u abonnementen expliciet moet beheren.
- Afmelden voor gebeurtenissen wanneer ze niet langer nodig zijn, vooral als ze sterke referenties gebruiken.
- Vermijd het behouden van sterke verwijzingen naar objecten die moeten worden verzameld, zoals weergavemodellen of weergaven.

Door deze praktijken te volgen en het zwakke abonnementsmechanisme van MVVMCross te benutten, kunnen ontwikkelaars ervoor zorgen dat evenementabonnementen niet voorkomen dat objecten worden verzameld, waardoor efficiënt geheugenbeheer in hun toepassingen wordt gehandhaafd.

Citaten:
[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-raise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gc-in-mono-droid-using-mvvmcross
[4] https://gregshackles.com/weak-subscription-gotcha-in-mvvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-inaction/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage collected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-memory-loak-16