Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Bagaimana MVVMCross Memastikan Pengumpulan Sampah untuk Langganan Acara


Bagaimana MVVMCross Memastikan Pengumpulan Sampah untuk Langganan Acara


MVVMCross memastikan pengumpulan sampah untuk langganan acara terutama melalui penggunaan referensi yang lemah. Berikut penjelasan terperinci tentang cara kerjanya:

Gambaran Umum MVVMCross Messenger

Plugin MVVMCross Messenger dirancang untuk memfasilitasi agregasi acara antar komponen. Ini memungkinkan komponen untuk berkomunikasi dengan menerbitkan dan berlangganan pesan. Messenger menggunakan referensi yang lemah untuk langganan peristiwa, yang membantu mencegah kebocoran memori dengan memungkinkan pengumpul sampah untuk menghapus objek yang tidak lagi dirujuk.

Referensi yang lemah di MVVMCross

Saat Anda berlangganan pesan menggunakan MVVMCross Messenger, Anda dapat menentukan apakah akan menggunakan referensi yang lemah atau kuat. Secara default, MVVMCross menggunakan referensi yang lemah (`mvxReference.weak`) untuk berlangganan. Ini berarti bahwa messenger tidak memiliki referensi yang kuat untuk metode panggilan balik, memungkinkan pengumpul sampah untuk menghapus langganan jika objek yang berlangganan keluar dari ruang lingkup.

Berlangganan dan Deskripsi

Langganan dapat dikelola menggunakan beberapa metode:
- Berlangganan: Pesan dilewatkan langsung di utas penerbitan.
- SubscribeOnMAnthread: Pesan diiklankan ke utas UI utama.
- SubscribeOnThreadPoolThread: Pesan antri untuk pemrosesan kumpulan utas.

Setiap metode berlangganan mengembalikan `mvxsubscriptionToken`, yang dapat digunakan untuk berhenti berlangganan dari pesan. Namun, jika token tidak disimpan, langganan mungkin dikumpulkan segera.

mekanisme pengumpulan sampah

Mekanisme pengumpulan sampah dalam mvvmcross bergantung pada `mvxsubscriptiontoken` yang dikumpulkan saat keluar dari ruang lingkup. Jika token berlangganan tidak disimpan, itu akan memenuhi syarat untuk pengumpulan sampah, yang dapat menyebabkan gangguan penangan acara. Pendekatan ini memastikan bahwa objek tidak disimpan dalam memori yang tidak perlu karena langganan peristiwa.

Mengamati status langganan

MVVMCross juga menyediakan metode untuk mengamati status berlangganan saat ini, seperti `hassubscriptionsfor` dan` countsubscriptionsFor`. Selain itu, Messenger menerbitkan pesan `MVXSubScriberChangeSage` setiap kali langganan ditambahkan, dihapus, atau kedaluwarsa, memungkinkan komponen untuk menyesuaikan perilaku mereka berdasarkan keadaan berlangganan saat ini.

Praktik terbaik untuk manajemen memori

Untuk memastikan pengumpulan sampah yang efektif dan mencegah kebocoran memori:
- Gunakan referensi yang lemah untuk langganan acara bila memungkinkan.
- Simpan token berlangganan jika Anda perlu mengelola langganan secara eksplisit.
- Berhenti berlangganan dari peristiwa ketika mereka tidak lagi diperlukan, terutama jika menggunakan referensi yang kuat.
- Hindari menjaga referensi yang kuat ke objek yang harus dikumpulkan sampah, seperti model tampilan atau tampilan.

Dengan mengikuti praktik -praktik ini dan memanfaatkan mekanisme berlangganan yang lemah MVVMCross, pengembang dapat membantu memastikan bahwa langganan peristiwa tidak mencegah objek dikumpulkan sampah, sehingga mempertahankan manajemen memori yang efisien dalam aplikasi mereka.

Kutipan:
[1] https://www.mvmcross.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-in-action/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-leak-16