我知道内存泄漏几乎已经在堆栈溢出时死亡,但这是另一个问题,只是为了确定......
我有一个单独的类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();
}
然后在我的Activity中,我将Activity实例添加到管理器的mListeners
,在我的理解中,这是创建一个对Activity的静态引用,可能会破坏Activity的生命周期,这很糟糕。
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
答案 0 :(得分:1)
您应该清楚地删除onPause()
或onStop()
中的引用,而不是onResume()
中的引用。
这样做应该删除对您的活动的所有引用,从而防止内存泄漏。