2013-10-29 19 views
5

Tôi đang sử dụng Messenger Plugin trong ứng dụng MvvmCross của mình và đã nhận thấy rằng đôi khi nó xóa các đăng ký của tôi ("Một hoặc nhiều người nghe không thành công - đã xóa lịch biểu"). Điều này gây ra lỗi trong ứng dụng của tôi. Theo mặc định, tôi đang sử dụng tham chiếu yếu cho đăng ký và tôi không hủy đăng ký thư.MvvmCross Messenger Plugin Dọn dẹp đăng ký

Tôi có cần hủy đăng ký không? Không phải là điểm của một tham chiếu yếu để cho phép nó được thu gom rác?

Cơ sở của tôi đang đăng ký trong hàm tạo như được hiển thị bên dưới.

public BaseView() 
    { 
     _messenger = Mvx.Resolve<IMvxMessenger>(); 
     _messenger.Subscribe<MyMessage>(s => Method()); 
    } 

Dưới đây là thiết bị phát sóng phát của tôi xuất bản tin nhắn của tôi.

var _messenger = Mvx.Resolve<IMvxMessenger>(); 
_messenger.Publish<MyMessage>(new MyMessage(this)); 

Tôi có ý định cố gắng hủy đăng ký trong onDestroy.

Nếu bạn có thể cho tôi một số thông tin chi tiết về lý do tại sao điều này đang xảy ra và một giải pháp có thể tôi sẽ biết ơn.

Xin cảm ơn trước.

+0

Câu hỏi này sẽ được hưởng lợi từ một số mã thay vì "Cơ sở của tôi đang đăng ký vào hàm tạo và có ý định cố gắng hủy đăng ký trong onDestroy." – Stuart

+0

Tôi đã thêm một số mã, hãy cho tôi biết nếu bạn cần thêm thông tin. – Jake

Trả lời

13

Khi sử dụng các tham chiếu yếu, điều quan trọng là lưu trữ mã thông báo đăng ký trả lại trong trường cấp lớp.

private IDisposable _token; 

public BaseView() 
{ 
    _messenger = Mvx.Resolve<IMvxMessenger>(); 
    _token = _messenger.Subscribe<MyMessage>(OnMyMessage); 
} 

private void OnMyMessage(MyMessage msg) 
{ 
    // code 
} 

Nếu bạn không làm điều này, thì GarbageCollector sẽ miễn phí để thu thập đăng ký.

Để biết thêm về vấn đề này, vui lòng xem phần trên "việc hủy đăng ký GC-based này sẽ xảy ra bất cứ khi nào thẻ thuê bao trở về từ Theo dõi là thu gom rác thải" trong wiki - https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#messenger

Các vấn đề liên quan