2016-09-14 2 views
1

Memory Leaks에 내 앱이 실행되는 위험을 줄이기 위해 노력하고 있습니다. 현재 저는 변수 수정에 대한 간단한 수정 작업을 중단하고 있습니다. 예를 들어 이 방법은 각각의 시간에,이 변수의 새로운 인스턴스가 생성 될 때마다 호출되어변수 초기화에 관한 메모리 관리 팁?

public void renameItems(Activity activity, ...) { 

AlertDialog.Builder builderInner = new AlertDialog.Builder(activity, R.style.MyAlertDialogStyle); 

    LinearLayout layout = new LinearLayout(activity); 
    final TextView itemTitle = new TextView(activity); 
    final EditText itemTitleInput = new EditText(activity); 
    final TextView subItem = new TextView(activity); 
    final EditText subItemInput = new EditText(activity); 

// Irrelevant code ... 

} 

? 그렇다면 어떻게해야 im이 완료 될 때 무효화 할 수 있습니까?

또한 변수의 범위를 변경해 보았습니다.하지만 메소드에 전달하는 컨텍스트를 전달해야하며 전역 배율로 어떻게 처리 할 것인지 확신 할 수 없습니다.

답변

1

아마도이 코드가 제공되는 솔루션에 대한 정확한 대답은 아니지만 응용 프로그램 내부에서 메모리 leask를 처리/감지하는 일반적인 솔루션을 요청한 것입니까? 그것은 LeakCanary

라고 그것은 앱에 통합하기 정말 쉬운 것 을 :

는 Godmaster 제이크 와튼은 몇 시간 전에 누수 잠재적 인 메모리를 감지하기위한 좋은 도구를 출시! (하지만 BE 조심 릴리스 빌드!에 추가 NOT)는 앱에 LeakCanary을 통합하는 방법을 설명하는 github page

: 당신의 build.gradle에서

:

dependencies { 
    debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4' 
    releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4' 
    testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4' 
} 
당신의 Application 클래스에서

:

public class ExampleApplication extends Application { 

    @Override public void onCreate() { 
    super.onCreate(); 
    LeakCanary.install(this); 
    } 
} 

은 sooooo는 ...하지만 지금은 누수 및 다음은 무엇을? 내 개인적인 경험에서 은 다음과 같이 일을 알고 :

  • 시도는 클래스 회원으로 활동 또는 활동 컨텍스트를 저장하지 않도록 할 수 있습니다. 가능한 경우 항상 응용 프로그램 컨텍스트를 대신 사용하십시오!
  • 런타임을 통해 레이아웃을 생성하지 않도록하십시오! EventBus, RxJava/RxAndroid 등을 사용하는 경우 xml 레이아웃
  • 등을 사용하여 해당 항목을 팽창시킵니다. 도구/framworks/providers에서 탈퇴하는 것을 잊지 마십시오. 액티비티가 종료 된 후 구독 취소되지 않은 경우 onPause() 또는 onStop()
  • 실제로 메서드 내에서 변수를 만드는 것이 두려운 경우에는 메서드 위쪽에 모든 변수를 만드는 것을 피하고 필요한 경우 만들도록하십시오! Java에서는 무효 화/종료하지 않습니다! 그래서 당신은 가비지 컬렉션을 가지고 있습니다!