2010-03-19 5 views
54

Trong Android, đang sử dụng biến tĩnh một thực tiễn được khuyến nghị? ví dụ, thực hiện một mô hình Singleton trong Java, tôi thường làm:Sử dụng các biến tĩnh trong Android

private static A the_instance; 
public static A getInstance() { 
    if (the_instance == null) { 
     the_instance = new A(); 
    } 
    return the_instance; 
} 

Ngoài ra, khi thực hiện điều này được dọn dẹp bởi Android JVM?

Cảm ơn bạn.

+0

Tôi tin rằng bạn sẽ cần một khóa để đồng bộ hóa cho lớp singleton của bạn, nếu không, bạn sẽ có nhiều đối tượng trên bộ nhớ heap trong kịch bản nhiều luồng. – shanwu

Trả lời

61

static được đính kèm với tổng thể Class, lần lượt được gắn với ClassLoader đã tải lớp. the_instance sẽ bị xóa khi toàn bộ ClassLoader được khôi phục. Tôi chắc chắn 90% điều này xảy ra khi Android phá hủy ứng dụng (không phải khi nó chuyển sang nền hoặc tạm dừng nhưng hoàn toàn tắt.)

Vì vậy, hãy nghĩ về điều đó khi bạn chạy ứng dụng. Singleton có phải là một ý tưởng hay không? Mọi người có quan điểm khác nhau. Tôi nghĩ rằng nó là tốt khi được sử dụng một cách thích hợp, bản thân mình. Tôi không nghĩ câu trả lời thay đổi nhiều trên Android. Việc sử dụng bộ nhớ không phải là vấn đề; nếu bạn cần tải một loạt các thứ trong bộ nhớ, đó là một vấn đề hay không, bất kể bạn có đóng gói dữ liệu trong Singleton hay không.

+4

Xác nhận, nó sẽ được giữ lại cho đến khi toàn bộ quá trình của bạn bị hủy. Khi quá trình của bạn được phục hồi, singleton của bạn sẽ xuất hiện trở lại! –

+13

Cần lưu ý rằng singleton sẽ được tạo lại, nhưng trạng thái ban đầu của singleton không được khôi phục tự động. Điều này sẽ phải được thực hiện bằng tay. –

+0

@Kevin Bạn có thể xây dựng nhận xét của mình không? –

0

Tôi không chắc liệu cách tiếp cận đó có tốt cho nền tảng di động không, nơi bạn có bộ nhớ hạn chế khả dụng cho mình. Chưa kể rằng ứng dụng sẽ chạy trên một thiết bị đa tác vụ được kích hoạt.

Tôi nghĩ rằng, cách tiếp cận này có thể hog bộ nhớ từ thiết bị nhưng tôi không có tài liệu để hỗ trợ điều này. Có lẽ ai đó được giáo dục nhiều hơn tôi có thể chia sẻ suy nghĩ của họ. Các trường

+0

Tôi không nghĩ rằng điều này thực sự có thể là một vấn đề kể từ khi DVM quản lý bộ nhớ của nó khá tốt. –

-4

Không. Đừng làm vậy! Singleton is an anti-patern!. Thay vào đó, hãy sử dụng tiêm phụ thuộc, cho dù thông qua một khung (chẳng hạn như thông qua Dagger hoặc Roboguice) hoặc bằng cách truyền một cách rõ ràng đối tượng instantiated.

+36

Hãy nhớ rằng nhóm Android cốt lõi ủng hộ việc sử dụng "chống mẫu" của bạn và Google Guice dường như yêu cầu khoảng 800KB JAR, điều này rất tệ đối với ứng dụng dành cho thiết bị di động. – CommonsWare

+5

Guice là tuyệt vời, nhưng nó có thể là quá mức cần thiết cho nhiều ứng dụng. Nhưng nếu bạn định đi sâu vào Guice, hãy xem dự án tốt này: http://code.google.com/p/roboguice/ –

+3

Công cụ tiêm phụ thuộc mang lại sự phức tạp. Tôi đã thấy một số nhà phát triển dành hàng giờ tìm ra lý do tại sao các đối tượng sai đã được tiêm. Singleton có giá trị của nó! – yonexbat

15

Tôi nghĩ biến tĩnh là OK.

Đây là những gì Android doc nói:

http://developer.android.com/guide/appendix/faq/framework.html

Làm thế nào để truyền dữ liệu giữa các hoạt động/dịch vụ trong một ứng dụng duy nhất?

Trường tĩnh/phương pháp công khai

Cách thay thế để truy cập dữ liệu trên các hoạt động/dịch vụ là sử dụng các trường và/hoặc phương thức tĩnh công cộng. Bạn có thể truy cập các trường tĩnh này từ bất kỳ lớp nào khác trong ứng dụng của bạn. Để chia sẻ một đối tượng, hoạt động tạo đối tượng của bạn thiết lập một trường tĩnh để trỏ tới đối tượng này và bất kỳ hoạt động nào khác muốn sử dụng đối tượng này chỉ truy cập trường tĩnh này.

+8

Ràng buộc, Callbacks/Listeners, nhưng không tĩnh –

+1

Bạn đã nghe về ý định? lĩnh vực tĩnh là thực tế xấu, nó có xu hướng chặt chẽ ... – AnixPasBesoin

+1

Bạn có thể vui lòng guys cung cấp giải pháp thích hợp cho tôi? Với các biến tĩnh tôi đang gặp phải một vấn đề khi ứng dụng đến từ nền hoặc vẫn mở trong nhiều giờ, nó bị treo. Với ý định rất khó để vượt qua đối tượng. Vậy cách thích hợp để làm điều này là gì? –