2011-01-16 3 views
1

私はJavaとAndroidの初心者ですが、現在、私はAndroidで "メモリリーク"について混乱しています。例えば、01クラス、01アクティビティ、01インターフェイスは次のようになります:メモリリーク:Java Garbage CollectorとAndroid killメカニズムの混乱?

クラスBackGroundWorkerは、どのアプリケーションの命ある限り住ん:

public class BackGroundWorker { 
private IOnEventOccurListener listener = null; 
private static BackGroundWorker instance; 
// .... 
public void setListener(IOnEventOccurListener pListener) { 
    this.listener = pListener; 
} 
// .... 
public static BackGroundWorker getInstance() { 
    //... 
    return instance; 
} 
} 

リスナーインタフェース:

public interface IOnEventOccurListener { 
public void onEventOccur(); 
} 

とリスナー自体(アクティビティ):

public class ShowSomething extends Activity implements IOnEventOccurListener{ 

BackGroundWorker bgWorker; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    bgWorker = BackGroundWorker.getInstance(); 
    bgWorker.setListener(this); 
} 

@Override 
public void onEventOccur() { 
    // TODO do something 

} 
} 

Romain Guyの言葉によると、here: リスナーへの参照があるため、メモリリークです(アクティビティ)。したがって、Java GCはアクティビティを使用していなくても収集できません。

は私が弱い参照によってその問題を解決することができました - しかし、まだ疑問に思う:必要に応じて、デバイスは、Android Devの文書に従って、より多くのメモリを必要とする。この場合、 は、それが活動を「殺す」になる - と仮定すると、アクティビティショー何かが "殺された" - 何が起こるのですか? (それはまだRomainガイによると漏れ、まだ "殺した")

私は本当に混乱しています。誰もこれを説明してもらえますか?

はAndroidがメモリを解放しようとする画面上にない活動を破壊する
息子

答えて

0

、高度にありがとう。ただし、GCルールは引き続き適用されるため、アクティビティへの静的な参照によってメモリが解放されることはありません。

最終的に、Androidはプロセス全体を終了します。その時点で、漏れたメモリは解放されます。しかし、あなたの活動が破壊されてからプロセスが終了するまでの間に、あなたはRAMを浪費しています。

アクティビティが破棄されたときに、WeakReferenceを使用するのではなく、静的参照をnullにしてください。

+0

は、どのように(私はより深く主題を理解したいさえを通じて、あなたの速い答えをありがとうアンドロイドは活動を "殺す"/"破壊する" - いつではないのですか)もっと詳しく読むためのヒントやリンクを教えてください。 – hungson175

+0

@Flow:助言に感謝しますが、私はまだ詳細な説明が必要です – hungson175

+0

@Commonware:私にはこのヒントや方向性を教えてください。 Btw、私はAndroidアプリをプログラミングして以来、あなたの記事から多くの有益な情報を見つけました。ありがとうございます:) – hungson175

0

私は、我々が使用する場合、それはリークを持っていると思います:代わりに

static BackGroundWorker bgWorker; 

BackGroundWorker bgWorker;