Фрагмент backstack использует слишком много памяти

Я работаю над довольно большим приложением (около 70 фрагментов). Когда я просматриваю свое приложение, все мои предыдущие фрагменты сохраняются в стеке. После нескольких кликов моя память довольно велика, и на старых телефонах (Samsung S3) я получаю исключение OutOfMemory.

Есть ли способ что-то сделать с использованием памяти обратного стека фрагментов? Я уже пытался сделать свой собственный backstack, он решил проблему с памятью, но единственная проблема заключалась в том, что он не запоминал условия поиска и позиции прокрутки таким образом:

Stack<BackStackEntry> mBackStack = new Stack<>();
mBackStack.add(new BackStackEntry(tag, fragment.getClass()));

person Bart Bergmans    schedule 29.03.2016    source источник


Ответы (2)


Вы можете использовать шаблон SingleTone для своих фрагментов. По крайней мере, это точно уменьшит память, потому что вам не нужно воссоздавать свои фрагменты каждый раз, когда вы вызываете или добавляете их в задний стек.

 // Singleton implementation
    private static YourFragment instance;

    public YourFragment () {
    }

    /**
     * Static method which return the instance of the fragment. If the fragment is null, load it,
     * else create new fragment. Singleton pattern.
     *
     * @param context
     * @return
     */
    public static YourFragment getInstance() {
        if (instance == null) {
            instance = new YourFragment ();
        }

        return instance;
    }

и вы можете получить доступ к своему фрагменту с помощью этой строки кода:

SearchFragment.getInstance()
person Kristiyan Varbanov    schedule 29.03.2016
comment
Но сохраняет ли это положение прокрутки и т. д.? - person Bart Bergmans; 29.03.2016
comment
Я думаю, что у вас нет проблем с прокруткой. - person Kristiyan Varbanov; 29.03.2016

В очень особых ситуациях вы можете запросить больший размер кучи, установив для атрибута largeHeap значение «true» в теге манифеста. Никогда не запрашивайте большую кучу просто потому, что у вас закончилась память и вам нужно быстрое исправление — вы должны использовать ее только тогда, когда точно знаете, где выделена вся ваша память и почему она должна быть сохранена.

Прочтите https://developer.android.com/training/articles/memory.html

person Roman Havran    schedule 29.03.2016
comment
Я хочу предотвратить это - person Bart Bergmans; 29.03.2016
comment
На самом деле android:largeHeap — это инструмент для увеличения выделенной памяти для приложения. Нет четкого определения необходимости использования этого флага. Если вам нужно больше памяти - Android предоставляет вам инструмент для ее увеличения. А вот необходимость использования вы определяете сами. - person Stanojkovic; 29.03.2016