避免静态上下文引用导致内存泄漏的可能解决方案

时间:2014-02-17 02:52:44

标签: android android-activity memory-leaks android-context

我知道内存泄漏几乎已经在堆栈溢出时死亡,但这是另一个问题,只是为了确定......

我有一个单独的类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

1 个答案:

答案 0 :(得分:1)

您应该清楚地删除onPause()onStop()中的引用,而不是onResume()中的引用。
这样做应该删除对您的活动的所有引用,从而防止内存泄漏。