2014-02-17 6 views
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(); 
}   

А потом в моей деятельности, я добавить экземпляр Activity к Управляющему mListeners, в моем понимании, это создает статическую ссылку что потенциально может привести к нарушению жизненного цикла 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

Вы должны четко удалить ссылки в onPause() или onStop(), а не в onResume().
Это должно удалить все ссылки на вашу активность и, следовательно, предотвратить утечку памяти.

+0

Эй. Извини, я виноват. напечатал вопрос на шине ... имел в виду 'disconnect()' в 'onPause()'. Скорректировали выше. С этой коррекцией это означает, что мой подход делает то, что он должен избегать утечки? – Jon

+0

Да, я уверен. – flx

+0

Хотя я бы предложил не очищать полный массивList, а только текущий экземпляр, если ваш список экземпляров находится в контексте приложения – user1530779

Смежные вопросы