2011-05-02 2 views
0

내 Activity의 방향 변경시 메모리 누수 문제가 있습니다.내부 클래스로 방향 변경 중 메모리 누수가 발생했습니다.

난 당신이 folowing 코드에서 볼 수 있듯이 나는 내부 클래스에 필요한 데이터를 저장 방향 변경시 : 안드로이드 도구와 메모리 분석 관점 (http://ttlnews.blogspot.com/2010/01/attacking-memory-problems-on-android.html)으로 마침내 다음과 같은 문제가 발견

public class TestOrientation extends Activity { 

    private ActivityData mData; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.mylayout); 
     ... 
     mData = (ActivityData) getLastNonConfigurationInstance(); 
     ... 
    } 

    @Override 
    public Object onRetainNonConfigurationInstance() { 
     return new ActivityData(dataToSave1, dataToSave2); 
    } 

    private class ActivityData { 

     public int mDataToSave1; 
     public String mDataToSave2; 

     public ActivityData(int dataToSave1, String dataToSave2) { 
      mDataToSave1 = dataToSave1; 
      mDataToSave2 = dataToSave2; 
     } 
    } 
} 

메모리 분석 Perspective에서 mData 속성이 Activity Context에 대한 참조를 유지하므로 결코 할당이 해제되지 않는다는 것을 알 수 있습니다. 몇 가지 방향 변경 후 나는 재귀 참조가 있습니다

sreenshot of MAP

그것을 해결하기 내가 별도의 파일에 ActivityData 선언했습니다,하지만 누군가가 나를 설명 할 수 있다면이 문제가 발생하는 이유는 좋은 것입니다!

답변

5

비공개 클래스 (ActivityData)를 정적으로 설정해야합니다. 내부 비 정적 클래스는 외부 클래스의 참조를 유지합니다.

+0

정적 인 ActivityData 클래스를 만들고 싶지는 않지만 게시물을 읽은 후에는 Java 문서 및 중첩 클래스 페이지 (http://download.oracle.com/javase/tutorial/java/)에있었습니다. javaOO/nested.html) : "인스턴스 메서드 및 변수와 마찬가지로 내부 클래스는 해당 클래스의 인스턴스와 연결되어 있습니다 ..." 그래서 내 활동에 대한 참조가 유지됩니다. 감사합니다. –

+1

어쨌든 필요없는 둘러싸는 클래스에 대한 액세스 권한을 잃는 것을 제외하고는 ActivityData를 정적으로 만드는 데 아무런 해가 없습니다. – devisnik

0

foo가 두 번째 인수라고 가정 해 봅시다.

아마도 foo는 someTextView.getText()와 같은 컨텍스트 내의 String일까요? foo.clone() 또는 단순히 새로운 String (foo)를 전달해보십시오.

관련 문제