2011-01-28 27 views
43

Tôi hiện đang phát triển một số Ứng dụng Android trong một nhóm và chúng tôi đã sử dụng 2 phương pháp tiếp cận khác nhau trong những tháng cuối cùng (một trong những cá nhân tôi đã đặt trước và người khác mà nhà phát triển khác thích).Android: Đề xuất AsyncTask: lớp riêng tư hoặc lớp học công khai?

Mặc dù cho đến nay các kết quả đều giống nhau, điều này đã cho tôi tự hỏi ... nên chúng tôi:

  • AsyncTasks sử dụng như các lớp học riêng bên trong hoạt động sử dụng chúng.
  • hoặc sử dụng AsyncTasks như các lớp học nào riêng biệt mà nhận bối cảnh hoạt động

Are bất kỳ phương pháp tiếp cận khuyến cáo của Google?

Kinh nghiệm của bạn nói gì về điều này (ưu điểm, nhược điểm, vấn đề)?

Trả lời

35

Các lớp bên trong rất phù hợp để đại diện cho các đối tượng có nghĩa là riêng tư hoặc bằng cách nào đó gắn liền với lớp kèm theo. Thỉnh thoảng có các lý do kỹ thuật để sử dụng các lớp bên trong (ví dụ: mô phỏng đóng cửa). Họ cũng cắt giảm ô nhiễm không gian tên.

Một bất lợi của các lớp bên trong là nếu chúng truy cập các thành viên riêng (các trường hoặc hàm) của lớp kèm theo, trình biên dịch sẽ tạo các hàm truy nhập cho các thành viên đó. Những người theo chủ nghĩa ngôn ngữ sẽ tranh luận liệu việc bẻ khóa này có phải là một điều tốt hay một điều xấu. Các chức năng truy cập thêm một chút chi phí cho mỗi truy cập (thường không phải là một yếu tố, nhưng có nó). Một bất lợi khác là nó làm cho tệp nguồn phức tạp hơn và do đó khó quản lý hơn. (Thỉnh thoảng tôi đã bị stung bằng cách chỉnh sửa một hàm trong lớp bên trong khi nghĩ rằng nó nằm trong lớp ngoài, và ngược lại.) Cuối cùng, các lớp bên trong có xu hướng không thể tái sử dụng được, trong khi các lớp riêng biệt thường có thể được tham số hóa để sử dụng nhiều lần .

Những ưu và khuyết điểm này nằm ngoài đầu của tôi. Tôi chắc rằng những người khác sẽ có thêm suy nghĩ.

UPDATE:

Trong Google IO video tùy chọn AsyncTask bên trong được đánh dấu rõ ràng lựa chọn là sai.

+1

Sau một thời gian sử dụng chúng dưới dạng các lớp công khai riêng biệt, tôi thấy rằng nó hữu ích hơn nhiều. – neteinstein

+14

@NeTeInStEiN - Đối với AsyncTask, một lớp bên trong (so với lớp tĩnh lồng nhau) luôn sai vì lý do kỹ thuật: một Activity có thể bị hủy bỏ (do, thay đổi cấu hình) mà không dừng AsyncTask. Nếu AsyncTask là một lớp bên trong, điều này sẽ làm rò rỉ Activity cũ vì AsyncTask sẽ có một tham chiếu (ẩn) đối với cá thể lớp bên ngoài. Một vài thay đổi định hướng của điện thoại sau đó sẽ khiến quá trình chết do kiệt sức của bộ nhớ. –

7

Việc sử dụng những gì có ý nghĩa nhất đối với mã của bạn là không quan trọng. Điều quan trọng là để xem một nhiệm vụ không đồng bộ đang giữ một tham chiếu về một hoạt động sau khi hoạt động đã bị phá hủy, hoặc ngầm định là một lớp bên trong của hoạt động, hoặc rõ ràng bằng cách cho đối tượng hoạt động/bối cảnh.

+4

Xem [thảo luận này] (https://groups.google.com/forum/#!starred/android-developers/vwRrlc84gy0) để biết giải pháp cho vấn đề (rất phổ biến) của AsyncTask giữ tham chiếu đến hoạt động. –

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