2011-12-09 22 views
6

Gần đây tôi đã biết được có bao nhiêu bộ nhớ có thể bị lãng phí do rò rỉ ngữ cảnh và cách kiểm tra rò rỉ như vậy với bộ nhớ kết xuất sau khi thay đổi hướng màn hình. Các hoạt động mới nên được khởi tạo và tạo ra, bản gốc bị phá hủy và thu thập. Tuy nhiên, trừ khi tôi đang bị rò rỉ bộ nhớ và không nhìn thấy nó, hoạt động bên dưới dường như không được thu thập nếu nó bắt đầu một hoạt động khác nhau và phá hủy bản thân:Thử nghiệm cho rò rỉ bộ nhớ trong các ứng dụng Android

public class Foo extends Activity { 
    private Button button; 

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

     button = new Button(this); 
     button.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       startActivity(new Intent(Foo.this, Bar.class)); 
       finish(); 
      } 
     }); 

     setContentView(button); 
    } 

    protected void onDestroy() { 
     super.onDestroy(); 

     button.setOnClickListener(null); 

     Log.e("you're it", "isFinishing() == " + isFinishing()); 
    } 
} 

 

public class Bar extends Activity { 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     TextView textView = new TextView(this); 
     textView.setText("hello, world"); 

     setContentView(textView); 
    } 
} 

Đây là thông tin kết xuất bộ nhớ, được thực hiện sau khi nhấp vào nút để khởi động Thanh và yêu cầu thu thập rác một vài lần:

Class Name            | Shallow Heap | Retained Heap 
---------------------------------------------------------------------------------------- 
com.test.testProject.Foo @ 0x4135b188     |   184 |   2,208 
mOuterContext android.app.ContextImpl @ 0x4135b390  |   96 |   392 
    <Java Local> java.lang.Thread @ 0x40996460 main Thread|   80 |   1,416 
    mContext android.media.AudioManager @ 0x4135b480  |   48 |   176 
---------------------------------------------------------------------------------------- 

Dựa trên this, tôi nghĩ rằng ném một kết thúc thêm giữa các hoạt động sẽ làm cho một trong những người đầu tiên đủ điều kiện cho bộ sưu tập và cho phép tôi để kiểm tra rò rỉ một cách bổ sung, là hợp lý này? Tôi có bị rò rỉ bộ nhớ không? Có lý do nào đó mà Android muốn giữ hoạt động bị phá hủy này không?

+1

You are not rò rỉ bộ nhớ. Tôi tin rằng GC chỉ đơn giản là chưa quyết định làm sạch hoạt động - mặc dù bạn đã yêu cầu thu gom rác thải. Bạn đang thử nghiệm phiên bản Android nào? Tôi nghĩ nếu bạn thử điều tương tự trên 3.0+, GC sẽ xóa nó nhanh hơn – Wozza

+0

Có lẽ kiểm tra đối tượng 'Intent' vẫn hoạt động khi phân tích tệp kết xuất. Nó có lẽ sẽ trỏ đến Foo và Bar. – Wozza

+0

Đây là trên nền tảng 4.0. Ngoài ra, có hai trường hợp Intent, một được tham chiếu bởi Foo và một được tham chiếu bởi Bar. Điều đó có ý nghĩa, tôi nghĩ, bởi vì mỗi Activity có một tham chiếu đến Intent của nó cho getIntent(). Nó không phải là ý định giữ cho hoạt động còn sống, phải không? – lwiseman

Trả lời

0

lẽ u có thể thử các mã như dưới đây:

button.setOnClickListener(new OnClickListener() { 
     public void onClick(View view) { 
      startActivity(new Intent(getApplicationContext(), Bar.class)); 
      finish(); 
     } 
    });