2016-09-14 63 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中,您不具有無效/終止它們!這就是爲什麼你有垃圾收集!