2017-10-24 7 views
0
private ArrayList<OutputInputPair> pairs = new ArrayList<OutputInputPair>(); 
public void process() { 
    while (!stopped) { 
     for (OutputInputPair pair : pairs) { 
      processCommandPairs(pair); 
     } 
    } 
} 

最初のときに、ユーザーのクリックストップボタン、stopped = trueので、ユーザーがボタンをクリックしない場合、 は常にprocessCommandPairsメソッドを実行します。arraylistを使うときにメモリリークを避けるには?

停止ボタンは、私は、ユーザーがボタンをクリックしないしない場合は、1つだけ質問があり、配列リストでメモリリークが正しい発生

@Override 
public void stop() { 
    Log.d(TAG, "STOP memory leak"); 
    pairs.clear(); 
    pairs = null; 
    stopped = true; 
} 

をクリックしてください?

もしそうでなければ、arraylistのメモリリークを避けるにはどうすればよいですか?

ありがとうございました。 enter image description here

+0

あなたは何をやっているのかは100%確信していませんが、イベント駆動型プログラミングのパラダイムと戦っているようです。 –

+0

@HovercraftFullOfEels 'process()'メソッドは、レコードstartだけを実行します。私はボタンのクリックを停止すると、arraylistの部分は、メモリリークが発生しません –

答えて

1
は、あなたの活動の onDestroyメソッドをオーバーライドして、あなたの活動が閉鎖され、ArrayListには、ガベージコレクションのために利用できるようになりますとき、whileループを抜けるように明示的にtrueに stoppedを設定し

+0

ありがとう、私の活動が閉じていない場合は、メモリリークが正しいですか? –

+0

あなたはそれがもはやそれを必要としなくてもRAMに格納されている場合は、メモリリークを伝えることができます。だからあなたがそれをもう必要としないとき、あなたはtrueに止められ、メモリリークは起こりません。 –

+0

ありがとう、私は私の活動を真実に止めた –

0

AndroidでWeakReferenceを使用することは、従来のJavaでの使用とまったく同じではありません。詳細な説明を提供する素晴らしいガイドがあります:https://community.oracle.com/blogs/enicholas/2006/05/04/understanding-weak-references

オブジェクトへの参照が必要なときはいつでも使用することを考えてください。ただし、その参照がガベージコレクタからオブジェクトを保護しないようにする必要があります。古典的な例として、メモリ使用量が高すぎる場合(WeakHashMapで実装されることが多い)、ガベージコレクトしたいキャッシュがあります。

関連する問題