2013-05-18 38 views
7

Tôi muốn tạo một lớp Singleton sẽ được gọi từ tất cả các điểm trong ứng dụng của tôi. Vấn đề là lớp này sẽ cần một bối cảnh cho các hoạt động của nó.Singleton với ngữ cảnh trong Android

Tôi không muốn phải tạo lại singleton trong mọi hoạt động vì cách này mất hết ý nghĩa, vì vậy tôi đã nghĩ về việc tạo nó trong MainActivity, với phương thức init, nơi tôi chuyển ngữ cảnh làm đối số. Từ thời điểm đó, Singleton của tôi có thể sử dụng được, nhưng tôi nghĩ đây là thiết kế tồi vì cách đó tham chiếu MainActivity của tôi sẽ luôn luôn được giữ và do đó tôi có thể gặp phải rò rỉ bộ nhớ.

Tôi có ở ngay đây không?

+2

Nếu đối tượng Singleton của tôi là tĩnh và tôi đang tham chiếu đến ngữ cảnh, bối cảnh đó không bao giờ được thu gom rác. Nếu tôi không nhầm, điều này có thể gây ra rò rỉ bộ nhớ. Nếu đây không phải là trường hợp, hãy mở rộng một chút về câu trả lời của bạn. – MichelReap

+0

Rò rỉ bộ nhớ * số nhiều *? Nếu đó là một singleton thì có một tham chiếu duy nhất cho các biến cá thể của nó. Làm thế nào là một rò rỉ, và thậm chí nếu nó được, làm thế nào nó sẽ thực sự * vấn đề *? –

+1

Vâng, tất cả các tài sản được lưu giữ trong hoạt động mà tôi bắt đầu Singleton của tôi sẽ được tổ chức trong suốt quá trình thực thi ứng dụng. Nếu ví dụ tôi có một hình ảnh lớn ở đó, nó có thể dễ dàng điền vào bộ nhớ của tôi và tôi có thể sớm chạy ra khỏi nó. – MichelReap

Trả lời

11

Bạn có quyền không lưu bối cảnh hoạt động chính vào singleton vì rò rỉ bộ nhớ. Nếu bạn cần bối cảnh liên tục bên trong singleton của bạn, sử dụng getApplicationContext(). Điều này có thể được lưu một cách an toàn. Lưu ý rằng mặc dù ngữ cảnh này không thể sử dụng được cho hầu hết các hàm liên quan đến gui. Trong trường hợp hiếm hoi, bạn cần ngữ cảnh hoạt động gọi bên trong singleton, chuyển ngữ cảnh hoạt động gọi đến phương thức singleton mà không lưu

+0

Ý của bạn là, nếu tôi sử dụng phương thức getApplicationContext() trên phương thức init(), tôi sẽ không gặp vấn đề rò rỉ bộ nhớ, trong khi nếu tôi chuyển trực tiếp tham chiếu hoạt động (tức là init (this)), đó là khi tôi gặp rắc rối? – MichelReap

+1

@MichelReap 'this' là nhiều hơn * chỉ * một ngữ cảnh. –

+0

Được rồi, tôi đoán đó là một chút thông tin mà tôi đã bỏ lỡ. – MichelReap

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