2009-01-24 23 views
8

Tôi có một mảng các đối tượng FileReference có nhiều trình nghe đính kèm với mỗi đối tượng, tôi có nên loại bỏ từng trình nghe trong phương thức xử lý của nó hay tôi nên xóa tất cả chúng trong trình xử lý hoàn chỉnh?Flex/AS3: Khi nào cần xóa người nghe?

Tôi đọc ở đâu đó để sử dụng tài liệu tham khảo yếu cho người nghe, nhưng tôi nghĩ rằng nó sẽ được tốt hơn để loại bỏ một cách rõ ràng người nghe (có?/Không?)

for each(var f:Object in fileCollection){ 
    var myFile:FileReference = f.file; 
    myFile.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.addEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.addEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.addEventListener(Event.COMPLETE, onComplete); 
} 

private function onUploadCompleteData(e:DataEvent):void{ 
    // doin my thing here 
    removeListeners(e) 
} 

private function removeListeners(e:Event):void{ 
    var myFile:FileReference = FileReference(e.target) 
    myFile.removeEventListener(DataEvent.UPLOAD_COMPLETE_DATA, onUploadCompleteData) 
    myFile.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
    myFile.removeEventListener(IOErrorEvent.IO_ERROR, onError); 
    myFile.removeEventListener(Event.COMPLETE, onComplete); 
} 

Trả lời

9

Nó luôn luôn là một ý tưởng tốt để loại bỏ các thính giả của bạn một cách rõ ràng khi bạn không còn cần chúng nữa, vâng, và cách bạn làm nó là tốt. Nó có vẻ hơi dài dòng, nhưng nó vẫn là thực hành tốt, và nó giúp bạn có thói quen biết người nghe của bạn ở đâu, vì không biết thường xuyên dẫn đến rò rỉ và hành vi bất ngờ.

Đối với sử dụngWeakReference, tôi hầu như luôn luôn sử dụng nó bản thân mình, ngoài việc loại bỏ những người nghe không cần thiết. Đối với tôi, nó trở thành quy tắc hơn là ngoại lệ. Tuy nhiên, nếu bạn phải chọn một người, hãy xóa người nghe của bạn một cách rõ ràng. Cá nhân, mặc dù, tôi làm cả hai.

Trong thực tế, tôi đã tìm thấy số lần mà tốt nhất nên sử dụngWeakReference sai, vì làm như vậy sẽ ngăn các đối tượng bị thu thập rác, đặc biệt hiếm khi xảy ra. Thật vậy, trước khi tôi biết được lập luận đó là gì (blog post here), tôi đã mất rất nhiều thời gian để gãi đầu sau khi có ngoại lệ thời gian chạy xuất phát từ khung Flex thực hiện cuộc gọi trên các thành phần mà tôi chắc chắn đã xóa khỏi danh sách hiển thị.

Deepa Subramaniam đã đề cập đến nó một cách bất thường trong her component-model talk tại hội nghị MAX năm ngoái (một cuộc trò chuyện tuyệt vời đáng xem xét); Tôi tin rằng cách cô ấy đặt nó là một cái gì đó như thế, "Tôi không biết tại sao nhóm người chơi Flash lại chọn sai mặc định là đúng, nhưng 99% thời gian, bạn sẽ muốn đặt giá trị đó thành thật."

+0

Bài đăng trên blog của bạn cũng hữu ích, cũng đã kiểm tra MAX talk, cảm ơn. – Ronn

2

Nếu bạn đang thêm đối tượng vào DisplayObject, tôi khuyên bạn nên xóa người nghe khi sự kiện Event.REMOVED_FROM_STAGE được kích hoạt và thêm họ khi được thêm vào giai đoạn. Đây là một cách dễ dàng để đảm bảo người nghe được xóa bằng cách rõ ràng phải gọi hàm removeListeners mà bạn đã viết. Ví dụ: trong đoạn mã của bạn, nếu tải không thành công thì người nghe sẽ không bao giờ bị xóa.

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