Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 避免静态上下文引用导致内存泄漏的可能解决方案_Android_Android Activity_Memory Leaks_Android Context - Fatal编程技术网

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
    }
}