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