2011-12-30 31 views
5

Một vài ngày trước, tôi đã phát hiện ra rằng singleton có thể trở thành chống mẫu trong Android. Singleton của tôi (class với private constructor và instance được lưu trữ trong static field) đã bị xóa (instance đã bị xóa mặc dù thực tế các hoạt động khác vẫn đang sử dụng singleton này (thông qua phương thức getInstance()) nên một instance khác phải được tạo). lần đầu tiên được gọi đã bị xóa (sau khi gọi kết thúc cho chỉ một hoạt động này).Vòng đời của singum dựa trên enum trên Android

Tôi đã đọc vấn đề này có thể được giải quyết như thế nào nhưng tôi cũng chỉ đọc "Java hiệu quả". Có nói rằng "loại enum phần tử đơn là cách bast để thực hiện một singleton".

Vì vậy, bây giờ tôi tự hỏi điều gì sẽ là vòng đời của singleton được tạo theo cách này trong ứng dụng Android? Nó sẽ giống như trong trường hợp "triển khai singleton chuẩn" vậy sau khi phá hủy hoạt động mà từ đó nó được gọi lần đầu tiên nó sẽ bị phá hủy (ngay cả khi nó được sử dụng trong các hoạt động khác)?

Tôi không hỏi về thực hiện singleton android thích hợp hoặc mẫu đơn singleton (nó là hoa văn hoặc chống mẫu vv) nhưng tôi muốn biết vòng đời của đối tượng enum singleton như thế nào và khi nào nó sẽ bị phá hủy.

+0

Singleton là một mô hình chống nói chung.Nếu bạn thực sự cần một cái gì đó, chỉ cần không làm cho một cái gì đó khác: P – cHao

+0

Điều này có thể cần một số làm rõ: Singleton của bạn (tức là mã bạn đưa vào enum của bạn) và tham chiếu từ Android biến mất khi hoạt động của bạn đã thoát (và ứng dụng của bạn đã bị tắt)? Đây sẽ là hành vi mong đợi cho bất kỳ singleton nào - tất cả trạng thái bạn cần giữ lại giữa các lần khởi động lại ứng dụng phải được lưu trữ vĩnh viễn - như 'SharedPreferences' OTOH, tôi hoàn toàn có thể hiểu lầm câu hỏi :-D – Jens

+0

@Jens Tôi đã cập nhật câu hỏi của mình. – mmatloka

Trả lời

2

Trong mọi trường hợp, các lớp bạn sử dụng được gắn với ClassLoader đã tải chúng. Điều này đúng trong Java nói chung, không chỉ là Android. Android sẽ cô lập các hoạt động bằng cách sử dụng mới ClassLoader s mỗi lần - ít nhất, nó không hứa hẹn nó sẽ không, và nó làm như xa như tôi có thể nói.

Bất kỳ trạng thái mức đơn hoặc trạng thái cấp lớp nào khác, được gắn với Class được gắn với ClassLoader. Đây là lý do tại sao trạng thái của bạn "biến mất"; thực tế là mã gọi điện của bạn đang nhìn thấy một Class mới trong một ClassLoader mới.

Vì vậy, thủ thuật dựa trên enum của bạn hoặc bất kỳ thứ gì khác dọc theo các dòng này, sẽ có cùng một hành vi giống nhau. Bạn không thể "kiên trì" thông tin hoạt động theo cách này. Bạn có thể và nên viết cho một DB SQLite. Có thể bạn cũng có thể giấu nó trong số SharedPreferences.

-2

thực hiện singleton an toàn của tôi là như thế:

tôi tạo ra một lớp singleton trong đó có một thuộc tính của boolean 'didReceiveMemoryWarning';

public class SingleTon(){ 
    public boolean didReceiveMemoryWarning = true; 
    ... 
    ... 
} 

Trong ứng dụng màn hình đầu tiên (Đó là màn ra mắt chính xác đầu tiên) (Tôi có một màn hình mà có thể nhìn thấy 3 giây)

SingleTon.getInstance().didReceiveMemoryWarning = false; 

Và trong mọi phương pháp Hoạt động của onCreate(), kiểm tra boolean này dữ liệu,

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    if(SingleTon.getInstance().didReceiveMemoryWarning){ 
      { Load your data from local to your SingleTon class, 
      because your app was released by OS}; 
    } 
} 

đó là triển khai của tôi.

+0

Đây chỉ là một singleton. Anh ấy nói đây là những gì không hiệu quả. –

0

Đối tượng ứng dụng là một vị trí tốt để lưu trữ thông tin cần truy cập vào các phiên bản hoạt động hoặc dịch vụ khác nhau. Bạn có thể truy xuất nó như thế này (đây là một Hoạt động hoặc Dịch vụ):

ứng dụng riêng MyApplication;

in onCreate (...) { ... this.app = (MyApplication) this.getApplication(); ... }

Nhớ đặt tên cũng trong biểu hiện: Đặt thuộc tính "name" của "ứng dụng" tag: Giá trị là đường dẫn đến lớp tương đối so với gói ứng dụng của bạn.

Đối tượng ứng dụng được tạo khi ứng dụng được khởi động, bạn có thể khởi tạo như trong một hoạt động hoặc dịch vụ trong phương thức onCreate() của nó.

Một điều cần nhớ: Đối tượng ứng dụng có thể tồn tại đóng hoạt động "cuối cùng" của bạn. Trong trường hợp này, bạn có thể nhận được cùng một đối tượng ứng dụng với trạng thái từ tương tác trước đó với ứng dụng của bạn. Nếu đây là một vấn đề bạn phải bằng cách nào đó phát hiện khởi đầu ban đầu của ứng dụng của bạn (ví dụ như sử dụng một hoạt động phóng đặc biệt không có giao diện người dùng, khởi tạo đối tượng ứng dụng và sau đó bắt đầu một mục đích mới BTW, điều tương tự có thể xảy ra với người độc thân nếu họ không

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