2010-04-13 32 views
6

Tôi đang sử dụng mô hình MVP từ ứng dụng GWT của tôi làm theo tấm gương đưa ra ở đây http://code.google.com/webtoolkit/doc/latest/tutorial/mvp-architecture.htmlthuyết trình unbinding cần thiết trong GWT

Tôi có một MainPresenter đơn và sub-người dẫn chương trình cho mỗi bảng điều khiển trong các MainView. Để hiển thị một tiểu trình mới, tôi làm điều gì đó như thế này:

presenter = new PresenterA(new ViewA(), ....); 
presenter.go(panel) // presenter clears the panel and itself to the panel 

Khi PresenterA được tạo ra, nó liên kết với bản thân các sự kiện trong ViewA. Câu hỏi của tôi là cách thích hợp để chuyển sang người trình bày mới là gì? Ngay bây giờ, tôi chỉ cần tạo một người trình bày mới và đính kèm nó vào cùng một bảng điều khiển như sau:

presenter = new PresenterB(new ViewB(), ....); 
presenter.go(panel) // presenter clears the panel and itself to the panel 

Tôi có một số nghi ngờ về phương pháp này. Trước tiên, tôi có gây ra rò rỉ bộ nhớ khi chuyển sang trình bày mới không? Tôi đã mất cả hai trường tham chiếu đến người trình bày cũ và xóa nó khỏi bảng điều khiển mà nó được đính kèm. Tôi cho rằng điều này có nghĩa là nó phải được thu gom rác, nhưng tôi không thực sự chắc chắn. Thứ hai, điều gì sẽ xảy ra với các ràng buộc sự kiện mà người trình bày cũ đã có? Những ràng buộc này có ngăn cản người trình bày không bị thu gom rác không? Tôi có cần unbind chúng trước không?

Cách chính xác xử lý tình huống chuyển đổi diễn giả mà không bị rò rỉ bộ nhớ và liên kết với sự kiện "đã chết" là gì.

Trả lời

6

Tôi khuyên bạn nên xem các thư viện gwt-mvp và/hoặc gwt-presenter, cả hai đều có cùng cách tiếp cận với vấn đề này. Có hiệu quả, bạn tạo một lớp cơ sở cho tất cả các diễn giả duy trì một danh sách nội bộ của tất cả các đăng ký sự kiện mà người trình bày có. Khi bạn đến để chuyển đổi người trình bày, bạn gọi presenter.unbind() trên người trình bày cũ, sau đó xóa tất cả các trình xử lý sự kiện bạn đã tạo.

Các cơ sở lớp người dẫn chương trình sẽ giống như thế này:

public abstract class BasePresenter { 

    private List<HandlerRegistration> registrations = Lists.newLinkedList(); 

    public void bind() {} 

    public void unbind() { 
     for(HandlerRegistration registration : registrations) { 
      registration.removeHandler(); 
     } 
     registrations.clear(); 
    } 

    protected void addHandler(HandlerRegistration registration) { 
     registrations.add(registration); 
    } 

} 

Sau đó, trong phương pháp ràng buộc của người dẫn chương trình của bạn, bạn vượt qua các đối tượng của HandlerRegistration vào addHandler() phương pháp:

bind() { 
    addHandler(foo.addBarHandler(...)); 
} 
Các vấn đề liên quan