2014-02-17 80 views
0

內存泄漏我知道,內存泄漏已接近完成死刑堆棧溢出,但在這裏不用另外一個問題,只是要確定可能的解決方案......避免從靜態上下文引用

我有一個單例類,MyManager,在某某事件上通知聽衆事情已經改變。這位經理管理一些'全球'數據結構,因此我使用它。

public final class MyManager{ 

    private final static MyManager INSTANCE = new MyManager(); 

    private ArrayList<MyManagerListener> mListeners = new ArrayList<MyManagerListener>(); 


    public static void addListener(MyManagerListener l){ 
     if (!INSTANCE.mListeners.contains(l)) INSTANCE.mListeners.add(l); 
    } 

    public static void disconnect(){ 
     // Does calling this in Activity's onPause() avoid memory leak? 
     INSTANCE.mListeners.clear(); 
    } 

    /// Implementation of Manager stuff which includes call to mListener.doSomething(); 

} 

我那當然有接口MyManagerListener

public interface MyManagerListener{ 
    public void doSomething(); 
}   

然後在我的活動,我的活動實例添加到經理的mListeners,在我的理解,這是創建靜態參考該活動可能會破壞活動的生命週期,這是不好的。

public class MainActivity extends Activity implements MyManagerListener{ 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Create potential memory leak here. 
     MyManager.addListener(this); 
     ... 
    } 

    protected void onPause(){ 
     super.onPause(); 
     // does calling this fix the potential memory leak? 
     MyManager.disconnect(); 
    } 

    @Override 
    public void doSomeThing(){ 
     //do something 
    } 
} 

我的問題是,我收錄的MyManager.disconnect()是否解決了潛在問題?我知道打電話ArrayList.clear()集列表的底層陣列中的所有對象null

回答

1

你應該清楚地onPause()onStop()代替onResume()刪除引用。
這樣做應該刪除所有對您的活動的引用,從而防止內存泄漏。

+0

嘿。對不起這是我的錯。在公共汽車上輸入問題......意味着在'onPause()'中有'disconnect()'。以上已更正。有了這個修正,這是否意味着我的方法正在做它應該避免泄漏的方法? – Jon

+0

是的,我很確定。 – flx

+0

雖然我會建議不清除完整的arrayList,但只有當前實例,如果您的實例列表在應用程序上下文中 – user1530779

相關問題