2016-09-14 5 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 Jake Wharton выпустила хороший инструмент для обнаружения потенциальной утечки памяти некоторое время назад: Это называется 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' 
} 

В классе Application:

public class ExampleApplication extends Application { 

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

Sooooo ... Но теперь у вас есть утечка и что дальше? Из моего личного опыта быть в курсе делать что-то вроде этого:

  • попытки избежать сохранения деятельности или контекста деятельности в качестве класса члена. Вместо этого используйте контекст приложения, если это возможно!
  • старайтесь избегать создания макета через время выполнения! Надуйте их, используя xml-макет
  • , если вы используете EventBus, RxJava/RxAndroid и т. Д.: Не забудьте отказаться от подписки на инструменты/фреймворки/провайдеры, вы используете . Если они не отписаны после того, как активность закончилась onPause() или onStop()
  • Если вы действительно боитесь создавать переменные внутри своего метода, постарайтесь избежать создания всех переменных в начале метода, создайте их, когда они вам понадобятся! В Java у вас нет прав на nullify/terminate! Вот почему у вас есть коллекция мусора!