Переданная переменная в onSaveInstanceState() очищается в onDestroy

Я задал этот вопрос: savedInstanceState.getParcelableArrayList() возвращает пустой список

Но теперь я обнаружил, что эта проблема связана с моим методом onDestroy().

Я сохраняю свой ArrayList с именем mVideos в onSaveInstanceState() и очищаю все его элементы внутри

onDestroy (я думал, что это сэкономит память, когда приложение будет убито).

В onCreate() я восстанавливаю сохраненные mVideos, НО он возвращает пустой список

Мой код:

   @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();

    if (mVideos != null)
        mVideos.clear();

    mVideos = null;
}

@Override
protected void onSaveInstanceState(Bundle out) {
    // TODO Auto-generated method stub

    out.putParcelableArrayList(VIDEO_LIST, mVideos);
    super.onSaveInstanceState(out);
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (savedInstanceState != null) {
        ArrayList<Video> saved = savedInstanceState.getParcelableArrayList(VIDEO_LIST);
       Log.e(VIDEO_LIST, "Count: " + saved.size());
    }
}

--> saved.size() = 0. Если я удаляю mVideos.clear() в onDestroy(), он работает правильно

Я знаю, что onSaveInstanceState() вызывается сразу после onPause(). НО зачем в таком случае, зачем onDestroy

эффекты для сохраненной переменной?


person Toan Tran Van    schedule 29.10.2014    source источник


Ответы (1)


Я думаю, что в onSaveInstanceState Android сохраняет указатель на область памяти, поэтому при вызове mVideos.clear() эта область памяти очищается, и когда вы пытаетесь восстановить его, он возвращает пустой список.

person romtsn    schedule 29.10.2014
comment
Да, у вас есть какие-нибудь предложения? - person Toan Tran Van; 29.10.2014
comment
Я предлагаю вам не очищать список и устанавливать для него значение null. Если Android решит, что ему не хватает памяти, он автоматически уничтожит ваш список :) Просто не беспокойтесь об этом. - person romtsn; 29.10.2014
comment
Я думал об этом. Я должен продолжать искать другие лучшие решения :) - person Toan Tran Van; 29.10.2014
comment
Другим решением является сохранение вашего списка в базе данных или SharedPreferences, после чего вы сможете очистить свой список. Но я думаю, если вы не видите плохого поведения своего телефона, просто забудьте об этом :D - person romtsn; 29.10.2014
comment
дополнительный вопрос: знаете ли вы, почему onSaveInstanceState() вызывается, если мы поворачиваем экран, НО если мы выйдем из приложения, нажав клавишу НАЗАД, этот метод никогда не будет вызван? - person Toan Tran Van; 29.10.2014
comment
Конечно. Когда вы поворачиваете экран, ваша активность немедленно уничтожается, поэтому будет вызван метод onDestroy(). Затем ваша активность также немедленно воссоздает вызов onCreate(). Вот почему немедленно вызывается onSaveInstanceState(). Но когда вы нажимаете кнопку НАЗАД, ваша активность НЕ УНИЧТОЖАЕТ, поэтому метод onDestroy() не вызывается, а просто вызывается onStop(), но Метод onDestroy() будет вызываться, когда Android решит, что ему не хватает памяти, и уничтожит ваше приложение. - person romtsn; 29.10.2014
comment
Я предлагаю вам прочитать эту статью о жизненном цикле Android developer.android.com/ обучение/основы/жизненный цикл активности/ - person romtsn; 29.10.2014
comment
Давайте продолжим обсуждение в чате. - person Toan Tran Van; 29.10.2014