фрагмент - лучший способ сохранить / восстановить модель после onDestroy деятельности? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть фрагмент, который находится внутри действия.Когда пользователь нажимает кнопку «Назад», мне нужно сохранить данные модели и сделать их доступными при следующем открытии фрагмента / действия.Но только в приложении его не нужно сохранять на диске.Так, например, если пользователь уничтожил процесс, то нет необходимости сохранять данные модели, они могут быть снова получены из сети.

что я пробовал: icePick и onSavedInstance звонки, но они, кажется, не срабатывают, когда пользователь нажимает кнопку возврата на фрагменте.скажи мне, если я не прав.

вот что я реализовал в своем фрагменте:

 @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
           outState.putParcelable("myModel", Parcels.wrap(myModel));
    }

Я использую библиотеку parceler , если это имеет какое-либо значение.Я также могу преобразовать код в kotlin, если требуется. когда я нажимаю кнопку "Назад", фрагмент извлекается из стека, и действие, содержащее его, вызывает onDestroy, но я не получаю никакого обратного вызова в onSaveInstanceState.Также, когда я проверяю, onCreate() savedInstanceState имеет значение null. Я не переопределил onSavedInstance в активности, только во фрагменте.Что я делаю неправильно ?

У меня была хотя бы возможность использовать базу данных для этого, но мне просто нужно, чтобы она находилась в памяти, и должен быть способ сделать это без БД.

из того, что я узнал, если пользователь нажимает кнопку «Назад», onSaveInstance не вызывается системой:

Если действие находится на переднем плане, а пользователь нажимает кнопку «Назад»,действия переходят через обратные вызовы onPause (), onStop () и onDestroy ().Помимо уничтожения, действие также удаляется из заднего стека.

Важно отметить, что по умолчанию обратный вызов onSaveInstanceState () в этом случае не срабатывает.

источник: здесь

1 Ответ

0 голосов
/ 27 мая 2018

#onSaveInstanceState фрагмента строго связан с жизненным циклом активности
В соответствии с документом

Вызывается для извлечения состояния отдельного экземпляра из действия перед его уничтожением

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

Я предлагаю использовать какое-то постоянное хранилище через интерфейс.Он может находиться в памяти (любой тип синглтона, как предложено в комментариях. Он может быть ограничен приложением, действием или настраиваемым случаем (необходимо вручную управлять жизненным циклом кэша) и вводиться, например, с помощью кинжала), совместно используемыми предпочтениями.базируемое хранилище, хранилище базы данных.Это легко проверить, если вы следуете шаблонам внедрения зависимостей и используете структурные шаблоны, такие как MVP (но это не главное в этом вопросе)

Поэтому сохраняйте данные в хранилище при изменении или в методе onPause(потому что это последний гарантированный вызов, когда экран исчезает).И восстановить его в onCreate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...