2016-09-14 61 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 ... 

} 

每当这个方法被调用时,正在创建这些变量的新实例每次?如果是这样,当我完成时我将如何使它们无效?我也试过改变变量的范围,但我需要传递一个上下文给他们(我从方法中获得的),我不确定我会如何在全球范围内做到这一点。

回答

1

也许这不是提供代码的解决方案的确切答案,但是您需要一个通用解决方案来处理/检测应用程序中的内存占用情况,对不对?

的Godmaster杰克沃顿商学院发布了一个很好的工具来检测潜在的内存泄漏前段时间: 这就是所谓的LeakCanary

这真的很容易集成到应用! (但要注意不要将它添加到发行BUILD !!!)在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' 
} 

在您的应用程序类:

public class ExampleApplication extends Application { 

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

SOOOOO ......但是,现在你有一个泄漏,下一步是什么? 从我个人的经验,知道做这样的事情:

  • 尽量避免在保存活动或活动上下文类 成员。如果可能,请始终使用应用程序上下文!
  • 尽量避免通过运行时创建布局!如果您使用的是EventBus,RxJava/RxAndroid等,请使用xml布局对它们进行膨胀
  • :不要忘记取消订阅您正在使用的工具/ framworks /提供程序 。如果他们在活动运行后未取消订阅 onPause()onStop()
  • 如果您真的害怕在方法内部创建变量,请尽量避免在方法顶部创建所有变量,并在需要时创建它们!在Java中,您不具有无效/终止它们!这就是为什么你有垃圾收集!