2010-07-27 29 views
25

Tôi đã đọc rằng đó là một sai lầm và một nguồn rò rỉ bộ nhớ trong ứng dụng Android để giữ một tham chiếu lâu dài đến một Ngữ cảnh.Android: Tham chiếu đến một bối cảnh và rò rỉ bộ nhớ

Nhưng tôi không hiểu nếu nó là ok để tạo ra một lớp trông như thế này một:

public class HelperClass { 
    private Context context; 

    public HelperClass(Context context) { 
     this.context = context; 
    } 
    public void myHelperMethod() { 
     // uses this.context 
    } 
} 

Và gọi nó từ một Hoạt động:

public class MyActivity extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     HelperClass h = new HelperClass(this); 
     h.myHelperMethod(); 
    } 

    ... 
} 

Trả lời

43

này là tốt, và sẽ không gây rò rỉ bộ nhớ.

Ngay sau khi onCreate hoàn thành việc thực thi, h sẽ nằm ngoài phạm vi và đủ điều kiện thu gom rác thải. Nếu h là tĩnh, thì bạn sẽ gặp phải vấn đề. Chỉ khi tham chiếu đến ngữ cảnh này còn tồn tại vòng đời của chính bối cảnh đó thì sẽ bị rò rỉ bộ nhớ. Một số gợi ý hữu ích:

  • Sử dụng Context.getApplicationContext() khi có thể. Bối cảnh này sẽ sống miễn là ứng dụng của bạn còn sống.
  • Hãy cẩn thận khi sử dụng các trường tĩnh và các lớp bên trong.
  • Run your application through a profiler để kiểm tra rò rỉ.
+1

Điều gì sẽ xảy ra nếu bạn có biến riêng với lớp trợ giúp như vậy trong hoạt động của bạn, có tham chiếu 'Ngữ cảnh'? – Peterdk

+2

@Peterdk nếu biến của bạn đang giữ trường hợp Ngữ cảnh từ getApplicationContext(), không có vấn đề gì. Nhưng nếu bạn đang giữ ngữ cảnh từ một Hoạt động, hãy cẩn thận với rò rỉ bộ nhớ (giữ đúng trường hợp hơn từ các Hoạt động nhiều hơn mức cần thiết). Có lẽ bạn nên sử dụng một WeakReference để giữ trường hợp ngữ cảnh hoạt động và sử dụng một người nghe để biết khi nào ứng dụng của bạn đã thay đổi sang hoạt động khác. – marciowb

6

Phạm vi của HelperClass chỉ nằm trong hàm onCreate của bạn, vì vậy khi onCreate thực hiện, đối tượng "h" của bạn không còn cần thiết và tùy thuộc vào việc thu gom rác.

Sẽ là một câu chuyện khác nếu "h" là thành viên tĩnh - R THNG sẽ là cách tuyệt vời để tiết kiệm bộ nhớ.

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