2016-09-14 4 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

多分これは右、提供するコードのためのソリューションに正確な答えはありませんが、処理するために、一般的な解決策を求めて/あなたのアプリケーション内のメモリleaskを検出しますか?

Godmasterジェイク・ウォートンは、潜在的なメモリは、いくつかの時間前にリークし検出するために便利なツールをリリース: それはLeakCanary

と呼ばれていますそれはあなたのアプリケーションに統合することは本当に簡単です!あなたのアプリケーションに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); 
    } 
} 

はすっごく...しかし、今、あなたはリークと次は何がありますか?私の個人的な経験から はこのような何かやって注意してください。

  • をクラス メンバーとしての活動やActivityコンテキストを保存しないようにしてください。可能であれば、常に代わりにアプリケーションコンテキストを使用してください!
  • 実行時にレイアウトを作成しないようにしてください。 EventBus、RxJava/RxAndroidなどを使用している場合は、xml-layout
  • を使用してそれらを膨張させてください: であるtools/framworks/providersからの退会を忘れないでください。アクティビティが実行された後に購読を解除されていない場合 onPause()またはonStop()
  • メソッド内に変数を作成することを本当に恐れている場合は、メソッドの先頭にすべての変数を作成しないようにしてください。 Javaでは、あなたはnullify/terminateしていません!だからあなたはガベージコレクションを持っているのです!