2010-08-03 5 views
0

다음 코드로 인해 메모리 누수가 발생합니까? 본질적으로 setContentView()를 사용하여 응용 프로그램의 다양한 레이아웃간에 전환하고 레이아웃의 다양한 뷰 (버튼/텍스트 뷰 ...)에 대한 참조를 유지하는 내 액티비티의 멤버 변수가 있습니다.메모리 누수가 발생합니까?

액티비티 클래스에 버튼에 대한 참조가 있고 레이아웃을 변경하면 레이아웃이 여전히 버튼 참조를 보유하기 때문에 가비지 수집되지 않을 것이라고 생각합니다. 이 경우 레이아웃을 변경하기 전에 버튼 변수를 null로 설정할 수 있습니까?

감사합니다.

public class MyApp extends Activity { 

    private Button startBtn; 

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

    // Set main layout 
    setContentView(R.layout.main); 

    startBtn = (Button) findViewById(R.id.startBtn); 
    startBtn.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
       doStart(); 
      } 

     }); 
    } 

    private void doStart() 
    { 
     // Change to starting screen layout 
     setContentView(R.layout.begin); 

     /// .. Work with more views here and change layouts in a bit .. // 
    } 

} 

답변

0

메모리 누수가 발생한다고 생각하지 않습니다. 레이아웃을 변경해도 활동이 삭제되지 않으므로 활동은 여전히 ​​바운드 참조를 제어합니다. 활동이 파괴되면 모든 기억을 정리해야합니다. 또한 레이아웃을 많이 전환하는 경우 별도의 활동을 사용하는 방법에 대해 생각해 보는 것이 좋습니다.

1

레이아웃을 변경하기 전에 버튼을 null로 설정해야합니다.

0

startBtn 참조를 보유하고 있거나 해당 활동의 인스턴스가 활성 상태 인 동안 R.layout.main (OnCreate에서 초기 할당)의 가비지가되지 않습니다. 어쨌든 그것은 잠재적 인 메모리 누수처럼 보이지 않습니다. 새 레이아웃을 설정할 때 뷰에 대한 참조를 해제해야합니다. 고려해야 할 또 다른 사항은 WeakReference를 사용하여 레이아웃 뷰에 대한 참조를 래핑하는 것입니다 (복잡한 디자인의 경우). 이렇게하면 레이아웃이 더 이상 액티비티에 연결되지 않으면 (보기에 대한 강력한 참조가없는 경우) WeakReference를 통해 참조하는 경우에도 모든 뷰가 병실이 될 수 있습니다.

관련 문제