2016-07-26 6 views
6

RecyclerViewFragment이 있습니다. 이 RecyclerView에서조각이 제거 된 후 메모리가 해제되지 않습니다.

, 나는 가끔 다운로드 할 수 있습니다 및 디스플레이 이미지 (ImageViewGlide로드.

을 나는 Fragment을 열 때, 사용 된 메모리는 때때로 1백메가바이트 주위 혹은 그 이상에 30메가바이트 주위에서 뛰어 수 있습니다.

Fragment을 잡고있다 Activity

완료, 메모리는

. 그것은 이전과 동일하게 유지. 확보하지 않습니다 나는 Glide 문서를 확인하고 분명히 우리는 BitmapsRecyclerView에 풀어 놓는 것에 대해 걱정할 필요가 없습니다. 이것은 앱이 종종 OOM으로 인해 충돌하기 때문에 큰 문제입니다.

Fragment을 제거하면 어떻게 메모리를 올바르게 처리해야합니까?

편집 : 또 다른 관찰

내가 눈치 또 다른 한가지는 그 나는 Activity을 완료 한 후 다시 같은 Activity을 시작합니다. 메모리가 잠시 뒤로 점프 한 다음 최대 100MB까지 백업하면 Fragment을 다시 시작하기 전에 메모리가 지워 졌다고 믿을 수 있습니다.

답변

4

가비지 수집은 때때로 Android에서 아픈 문제입니다. 대부분의 개발자는이 문제를 고려하지 않고 자원 할당에 대한 이해없이 개발을 계속합니다.

물론 누수, OOM 및 불필요한 리소스 바인딩과 같은 메모리 문제가 발생할 수 있습니다. 자동으로 메모리를 확보 할 방법이 없습니다. 당신은 어떤 상황에서도, 가비지 콜렉터

에만 의존 할 수없는 당신이 통과 할 때마다 조각의 또는 활동의 들의 OnDestroy() 메소드은, 당신이하고해야 할 것은 가 더 이상 필요하지 아니한다 어떤 구조를 지울 수있다 응용 프로그램에서. 다음을 수행 할 수 있습니다.

  1. 익명의 리스너 인스턴스를 피하십시오. 리스너를 만들고 더 이상 필요하지 않을 때 리스너를 파괴하십시오.
  2. click, longclick 등의 모든 리스너를 null로 설정합니다.
  3. 모든 변수, 배열을 지 웁니다. 활동 안에 포함 된 모든 클래스와 서브 클래스에 동일한 절차를 적용/조각
  4. 은 당신이 주어진 클래스에 이전 단계 중 하나를 수행 할 때마다 null로 변수를 설정

(모든 변수에 적용) 내가

public interface clearMemory(){ 
    void clearMemory(); 
} 

같은 인터페이스를 생성하고 모든 클래스에 구현 된 일을 결국, 그것은 활동, 조각 또는 일반 클래스 (어댑터, 사용자 정의보기 등 ​​포함)합니다.

클래스가 파괴 될 것이었다 때마다 나는이 방법을 부를 것이다 (내가 그렇게 할 필요가 생각 할 때마다 응용 프로그램이 파괴 되었기 때문에 나.주의 정상적인 실행에 폐기되지 않음) 구현함으로써

@Override 
public void onDestroy(){ 
    clearMemory(); 
} 

public void clearMemory(){ 
    normalButtonOnClickListener = null; 
    normalButton.setOnClickListener(null); 
    normalButton = null; 
    myCustomClass.clearMemory(); // apply the interface to the class and clear it inside 
    myCustomClass = null; 
    simpleVariable = null; 
    ...   
} 

을 이것은 체계적인 방식으로 내 응용 프로그램의 메모리 관리가 더 쉽고 가벼워졌습니다. 그러면 메모리가 언제 어떻게 언제 폐기되는지 알거나 제어 할 수 있습니다.

+0

감사합니다. 확실히 도움이됩니다. 나는 이것을 (애플 리케이션을 통해 이것을하기 전에 시간이 좀 걸릴지도 모르지만) 내일 시도 할 것이고, 내가 어떻게되었는지 알려줄 것이다. – Guy

+0

모든 변수를 지우라고 말하면 인스턴스 변수를 의미합니다. 맞습니까? onCreate 메서드에서 변수를 만들면 사용을 중지 한 후에 해당 변수를 지워야합니까? – Guy

+0

예. 당신이 할당 한 모든 것은 당신이 더 이상 필요가 없다는 것을 알게 되 자마자 처리되어야합니다 /해야합니다. 은유로 : 1) 일회용 종이를 구입합니다. 당신은 그 종이에 당신의 하루에 대한 몇 가지 사실을 적어 두십시오. 2) 하루 종일 종이를 사용합니다.하지만 종이가 영원히 필요 없다는 것을 알고 있습니다. 3) 하루가 끝날 무렵, 종이를 깨닫게됩니다. 이제 그 목적을 성취했습니다. 4) 종이를 찢어서 버리고 쓰레기통에 던져 버립니다. 이제 "종이 한장"을 사용하는 변수와 "하루"를 활동 주기로 이해하십시오. –

1

이것은 Ricardo의 답변에 추가됩니다.

당신은 안드로이드에 가비지 수집을 시작하기 위해 다음 코드를 추가 할 수 있습니다
Runtime.getRuntime().gc();

참고 : 호출이 기능을 모든 지역 변수가 null했습니다 후. 이 코드를 실행한다고해서 앱에서 가비지 수집이 보장되는 것은 아니며 단지 좋은 시간이라고 생각할 수 있습니다.
저는 모든 활동 'onDestroy()에서 이것을 사용했으며 항상 원할 때 작동하는 것처럼 보입니다.
시도해보십시오. 도움이 될 것입니다.

+0

정확합니다. 기본적으로 System.gc()를 호출하여 시스템에 "힌트"할 수 있으며, 결국 참조없이 모든 객체를 수집하기 위해 실행됩니다. 제어 된 메모리 관리는 항상 모든 응용 프로그램의 필수적인 부분입니다! –

관련 문제