关于初始化变量的内存管理技巧?

Memory management tips on initialising variables?

我正在尝试将我的应用 运行 降低为 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 ...

} 

每当调用此方法时,是否每次都会创建这些变量的新实例?如果是这样,完成后我将如何取消它们?

我也尝试过更改变量的范围,但我需要将上下文传递给它们(我从方法中收到),我不确定我将如何在全球范围内做到这一点。

也许这不是针对所提供代码的解决方案的确切答案,但您要求针对应用程序内部 handle/detect 内存泄漏的一般解决方案,对吗?

神师 Jake Wharton 前段时间发布了一个很好的工具来检测潜在的内存泄漏: 它叫做 LeakCanary

集成到您的应用程序中真的很容易! (但请注意不要将其添加到发布版本!!!)

github page 上描述了如何将 LeakCanary 集成到您的应用中:

在你的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'
 }

在您的申请中class:

public class ExampleApplication extends Application {

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

Sooooo...但是现在你漏水了,接下来怎么办? 根据我的个人经验,请注意做这样的事情:

  • 尽量避免将 Activity 或 Activity 上下文保存为 class 成员。如果可能,请始终使用应用程序上下文!
  • 尽量避免通过运行时创建布局!使用 xml-layout
  • 给它们充气
  • 如果您正在使用 EventBus,RxJava/RxAndroid,等等:不要忘记取消订阅您正在使用的 tools/framworks/providers 使用。如果他们在 Activity 遇到之后没有退订 onPause()onStop()
  • 如果您真的害怕在方法内部创建变量,请尽量避免在方法顶部创建所有变量,在需要时创建它们!在 Java 你没有 nullify/terminate 他们!这就是您拥有垃圾收集器的原因!