Android 避免静态上下文引用导致内存泄漏的可能解决方案
我知道在堆栈溢出时,内存泄漏几乎会导致死亡,但这里还有另一个问题,只是为了确定 我有一个单例类,Android 避免静态上下文引用导致内存泄漏的可能解决方案,android,android-activity,memory-leaks,android-context,Android,Android Activity,Memory Leaks,Android Context,我知道在堆栈溢出时,内存泄漏几乎会导致死亡,但这里还有另一个问题,只是为了确定 我有一个单例类,MyManager,它在某个事件上通知侦听器发生了变化。这个管理器管理一些“全局”数据结构,因此我使用它 public final class MyManager{ private final static MyManager INSTANCE = new MyManager(); private ArrayList<MyManagerListener> mListen
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();
}
然后在我的活动中,我将活动实例添加到经理的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()
或onStop()
中的引用,而不是onResume()
这样做应该删除对活动的所有引用,从而防止内存泄漏。Hey。对不起,我的错。在总线上键入问题…意味着在
onPause()
中有disconnect()
。已经纠正了上面的错误。通过此更正,这是否意味着我的方法在避免泄漏方面做了它应该做的事情?是的,我非常确定。虽然我建议不要清除完整的arrayList,但如果实例列表位于应用程序上下文中,则只清除当前实例
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
}
}