Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Cum asigură MVVMCross colectarea gunoiului pentru abonamentele pentru evenimente


Cum asigură MVVMCross colectarea gunoiului pentru abonamentele pentru evenimente


MVVMcross asigură colectarea gunoiului pentru abonamentele la evenimente în principal prin utilizarea referințelor slabe. Iată o explicație detaliată a modului în care funcționează:

Prezentare generală a MVVMcross Messenger

Pluginul MVVMcross Messenger este conceput pentru a facilita agregarea evenimentelor între componente. Permite componente să comunice prin publicarea și abonarea la mesaje. Messenger folosește referințe slabe pentru abonamentele pentru evenimente, ceea ce ajută la prevenirea scurgerilor de memorie, permițând colectorului de gunoi să elimine obiectele care nu mai sunt referite.

Referințe slabe în mvvmcross

Când vă abonați la un mesaj folosind MVVMCross Messenger, puteți specifica dacă utilizați o referință slabă sau puternică. În mod implicit, MVVMcross folosește referințe slabe (`mvxreference.weak`) pentru abonamente. Aceasta înseamnă că Messenger nu ține o referire puternică la metoda de apel, permițând colectorului de gunoi să elimine abonamentul dacă obiectul care a fost abonat iese din domeniu.

abonament și dezabonare

Abonamentele pot fi gestionate folosind mai multe metode:
- Abonați -vă: mesajele sunt transmise direct pe firul de publicare.
- AbonareOnMainThread: Mesajele sunt transmise la firul UI principal.
- AbonareOntThreadpoolThread: Mesajele sunt în coadă pentru procesarea grupului de thread.

Fiecare metodă de abonament returnează un `mvxsubscriptionToken`, care poate fi utilizat pentru a se dezabona din mesaj. Cu toate acestea, dacă jetonul nu este stocat, abonamentul poate fi colectat imediat gunoiul.

Mecanism de colectare a gunoiului

Mecanismul de colectare a gunoiului din MVVMcross se bazează pe „MvxsubscriptionToken”, fiind colectat gunoiul atunci când iese din domeniu. Dacă nu este stocat un jeton de abonament, acesta va fi eligibil pentru colectarea gunoiului, ceea ce poate duce la dezabonarea manipulatorului de evenimente. Această abordare asigură că obiectele nu sunt păstrate în memorie inutil din cauza abonamentelor la evenimente.

Observarea stării de abonament

MVVMCross oferă, de asemenea, metode de observare a stării curente de abonament, cum ar fi „HassubscriptionsFor” și `CountsubscriptionsFor”. În plus, Messenger publică mesaje `mvxsubscriberChangeMessage` ori de câte ori se adaugă abonamente, eliminate sau expiră, permițând componentelor să -și adapteze comportamentul pe baza stării de abonament curente.

Cele mai bune practici pentru gestionarea memoriei

Pentru a asigura colectarea eficientă a gunoiului și pentru a preveni scurgerile de memorie:
- Utilizați referințe slabe pentru abonamente la evenimente ori de câte ori este posibil.
- Stocați jetoane de abonament dacă aveți nevoie să gestionați abonamentele în mod explicit.
- Dezabonați -vă de la evenimente atunci când nu mai sunt necesare, mai ales dacă utilizați referințe puternice.
- Evitați să păstrați referințe puternice la obiecte care ar trebui să fie colectate de gunoi, cum ar fi modelele de vizualizare sau vizualizări.

Urmând aceste practici și folosind mecanismul slab de abonament al MVVMCross, dezvoltatorii pot ajuta la asigurarea că abonamentele la evenimente nu împiedică obiectele să fie colectate de gunoi, menținând astfel gestionarea eficientă a memoriei în aplicațiile lor.

Citări:
[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-mvmcross/
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
]
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-colected
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event-handler-Memory-Heak-16