Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon MVVMCROSS มั่นใจได้อย่างไรว่าการรวบรวมขยะสำหรับการสมัครสมาชิก


MVVMCROSS มั่นใจได้อย่างไรว่าการรวบรวมขยะสำหรับการสมัครสมาชิก


MVVMCROSS ทำให้มั่นใจได้ว่าการรวบรวมขยะสำหรับการสมัครสมาชิกเป็นหลักผ่านการใช้การอ้างอิงที่อ่อนแอ นี่คือคำอธิบายโดยละเอียดเกี่ยวกับวิธีการทำงาน:

ภาพรวมของ MVVMcross Messenger

ปลั๊กอิน MVVMCROSS Messenger ได้รับการออกแบบมาเพื่ออำนวยความสะดวกในการรวมเหตุการณ์ระหว่างส่วนประกอบ ช่วยให้ส่วนประกอบสามารถสื่อสารได้โดยการเผยแพร่และสมัครรับข้อความ Messenger ใช้การอ้างอิงที่อ่อนแอสำหรับการสมัครสมาชิกเหตุการณ์ซึ่งช่วยป้องกันการรั่วไหลของหน่วยความจำโดยอนุญาตให้ตัวเก็บขยะในการลบวัตถุที่ไม่ได้อ้างอิงอีกต่อไป

การอ้างอิงที่อ่อนแอใน mvvmcross

เมื่อคุณสมัครรับข้อความโดยใช้ MVVMcross Messenger คุณสามารถระบุว่าจะใช้การอ้างอิงที่อ่อนแอหรือแข็งแกร่ง โดยค่าเริ่มต้น mvvmcross ใช้การอ้างอิงที่อ่อนแอ (`mvxreference.weak`) สำหรับการสมัครสมาชิก ซึ่งหมายความว่าผู้ส่งสารไม่ได้มีการอ้างอิงที่แข็งแกร่งถึงวิธีการโทรกลับทำให้ผู้รวบรวมขยะสามารถลบการสมัครสมาชิกหากวัตถุที่สมัครเป็นสมาชิกออกนอกขอบเขต

การสมัครสมาชิกและ unsubscription

การสมัครสมาชิกสามารถจัดการได้โดยใช้หลายวิธี:
- สมัครสมาชิก: ข้อความจะถูกส่งโดยตรงในเธรดการเผยแพร่
- SubcribeOnMainThread: ข้อความจะถูกส่งไปยังเธรด UI หลัก
- SubcribeOnThreadPoolThread: ข้อความจะเข้าคิวสำหรับการประมวลผลพูลเธรด

วิธีการสมัครสมาชิกแต่ละวิธีส่งคืน `mvxsubscriptiontoken` ซึ่งสามารถใช้เพื่อยกเลิกการสมัครจากข้อความ อย่างไรก็ตามหากไม่ได้เก็บโทเค็นการสมัครสมาชิกอาจถูกเก็บรวบรวมขยะทันที

กลไกการรวบรวมขยะ

กลไกการรวบรวมขยะใน MVVMcross ขึ้นอยู่กับ `mvxsubscriptiontoken` การรวบรวมขยะเมื่อมันออกนอกขอบเขต หากไม่ได้เก็บโทเค็นการสมัครสมาชิกจะมีสิทธิ์ได้รับการรวบรวมขยะซึ่งสามารถนำไปสู่การไม่ใช้คำอธิบายของตัวจัดการเหตุการณ์ วิธีการนี้ทำให้มั่นใจได้ว่าวัตถุจะไม่ถูกเก็บไว้ในหน่วยความจำโดยไม่จำเป็นเนื่องจากการสมัครสมาชิกเหตุการณ์

สังเกตสถานะการสมัครสมาชิก

MVVMcross ยังมีวิธีการสังเกตสถานะการสมัครสมาชิกปัจจุบันเช่น `hassubscriptionsfor` และ` countsubscriptionsfor` นอกจากนี้ผู้ส่งสารเผยแพร่ข้อความ `mvxsubscriberchangeMessage` เมื่อใดก็ตามที่การสมัครสมาชิกถูกเพิ่มลบหรือหมดอายุทำให้ส่วนประกอบสามารถปรับพฤติกรรมของพวกเขาตามสถานะการสมัครสมาชิกปัจจุบัน

แนวทางปฏิบัติที่ดีที่สุดสำหรับการจัดการหน่วยความจำ

เพื่อให้แน่ใจว่าการเก็บขยะที่มีประสิทธิภาพและป้องกันการรั่วไหลของหน่วยความจำ:
- ใช้การอ้างอิงที่อ่อนแอสำหรับการสมัครสมาชิกเมื่อเป็นไปได้
- จัดเก็บโทเค็นการสมัครสมาชิกหากคุณต้องการจัดการการสมัครสมาชิกอย่างชัดเจน
- ยกเลิกการสมัครจากเหตุการณ์เมื่อไม่จำเป็นอีกต่อไปโดยเฉพาะอย่างยิ่งหากใช้การอ้างอิงที่แข็งแกร่ง
- หลีกเลี่ยงการอ้างอิงที่แข็งแกร่งไปยังวัตถุที่ควรเก็บขยะเช่นโมเดลมุมมองหรือมุมมอง

โดยการปฏิบัติตามแนวทางปฏิบัติเหล่านี้และใช้ประโยชน์จากกลไกการสมัครสมาชิกที่อ่อนแอของ MVVMcross นักพัฒนาสามารถช่วยให้มั่นใจได้ว่าการสมัครสมาชิกเหตุการณ์ไม่ได้ป้องกันวัตถุจากการรวบรวมขยะดังนั้นการจัดการการจัดการหน่วยความจำที่มีประสิทธิภาพในแอปพลิเคชันของพวกเขา

การอ้างอิง:
[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-mvmcross
[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