Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon Làm thế nào để mvvmcross đảm bảo thu gom rác cho đăng ký sự kiện


Làm thế nào để mvvmcross đảm bảo thu gom rác cho đăng ký sự kiện


MVVMcross đảm bảo thu gom rác cho đăng ký sự kiện chủ yếu thông qua việc sử dụng các tài liệu tham khảo yếu. Đây là một lời giải thích chi tiết về cách nó hoạt động:

Tổng quan về MVVMcross Messenger

Plugin MVVMCROSS Messenger được thiết kế để tạo điều kiện cho tập hợp sự kiện giữa các thành phần. Nó cho phép các thành phần giao tiếp bằng cách xuất bản và đăng ký tin nhắn. Messenger sử dụng các tài liệu tham khảo yếu cho các đăng ký sự kiện, giúp ngăn ngừa rò rỉ bộ nhớ bằng cách cho phép người thu gom rác loại bỏ các đối tượng không còn được tham chiếu.

Tài liệu tham khảo yếu trong MVVMCROSS

Khi bạn đăng ký tin nhắn bằng MVVMcross Messenger, bạn có thể chỉ định nên sử dụng tham chiếu yếu hay mạnh. Theo mặc định, MVVMCROSS sử dụng các tài liệu tham khảo yếu (`mvxreference.weak`) cho các đăng ký. Điều này có nghĩa là người đưa tin không giữ một tham chiếu mạnh mẽ đến phương thức gọi lại, cho phép trình thu gom rác xóa đăng ký nếu đối tượng đăng ký đi ra khỏi phạm vi.

Đăng ký và hủy đăng ký

Đăng ký có thể được quản lý bằng một số phương thức:
- Đăng ký: Tin nhắn được truyền trực tiếp trên chuỗi xuất bản.
- SubrossonMainThread: Tin nhắn được sắp xếp vào luồng giao diện người dùng chính.
- SubrossonThreadPoolThread: Tin nhắn được xếp hàng để xử lý nhóm luồng.

Mỗi phương thức đăng ký trả về một `mvxsubscriptoken`, có thể được sử dụng để hủy đăng ký từ tin nhắn. Tuy nhiên, nếu mã thông báo không được lưu trữ, đăng ký có thể được thu thập rác ngay lập tức.

Cơ chế thu gom rác

Cơ chế thu gom rác trong mvvmcross phụ thuộc vào `mvxsubcriptoken` đang được thu thập khi nó đi ra khỏi phạm vi. Nếu một mã thông báo đăng ký không được lưu trữ, nó sẽ đủ điều kiện để thu gom rác, điều này có thể dẫn đến việc hủy mô tả của trình xử lý sự kiện. Cách tiếp cận này đảm bảo rằng các đối tượng không được giữ trong bộ nhớ không cần thiết do đăng ký sự kiện.

Quan sát trạng thái đăng ký

MVVMCROSS cũng cung cấp các phương thức để quan sát trạng thái đăng ký hiện tại, chẳng hạn như `HassubScriptionsfor` và` CountSubScriptionsfor`. Ngoài ra, Messenger xuất bản các tin nhắn `MVXSubScribreChangEmessage` bất cứ khi nào đăng ký, xóa hoặc hết hạn, cho phép các thành phần thích ứng hành vi của chúng dựa trên trạng thái đăng ký hiện tại.

Thực hành tốt nhất để quản lý bộ nhớ

Để đảm bảo thu thập rác hiệu quả và ngăn ngừa rò rỉ bộ nhớ:
- Sử dụng tài liệu tham khảo yếu cho đăng ký sự kiện bất cứ khi nào có thể.
- Lưu trữ mã thông báo đăng ký nếu bạn cần quản lý đăng ký rõ ràng.
- Hủy đăng ký khỏi các sự kiện khi chúng không còn cần thiết, đặc biệt nếu sử dụng các tài liệu tham khảo mạnh mẽ.
- Tránh giữ các tài liệu tham khảo mạnh mẽ đến các đối tượng nên được thu thập rác, chẳng hạn như các mô hình xem hoặc chế độ xem.

Bằng cách tuân theo các thực tiễn này và tận dụng cơ chế đăng ký yếu của MVVMCROSS, các nhà phát triển có thể giúp đảm bảo rằng các đăng ký sự kiện không ngăn các đối tượng được thu thập rác, do đó duy trì quản lý bộ nhớ hiệu quả trong các ứng dụng của họ.

Trích dẫn:
[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
.
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
.
[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