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
嘿。對不起這是我的錯。在公共汽車上輸入問題......意味着在'onPause()'中有'disconnect()'。以上已更正。有了這個修正,這是否意味着我的方法正在做它應該避免泄漏的方法? – Jon
是的,我很確定。 – flx
雖然我會建議不清除完整的arrayList,但只有當前實例,如果您的實例列表在應用程序上下文中 – user1530779