Как восстановить состояние приложения при использовании dagger2 + mvp

ИЗМЕНИТЬ 2

У меня есть Activity с несколькими фрагментами. Activity управляет формой с несколькими шагами, каждый из которых является фрагментом. Моя реализация соответствует шаблону проектирования MVP, и я использую Dagger2 для внедрения компонентов (Presenters, Models, ...)

Данные, собранные на каждом этапе формы, хранятся в уникальном объекте, совместно используемом Fragment. Этот объект сохраняется до тех пор, пока Activity жив (с использованием @ActivityScope и вводится, поэтому Activity не связана с ним напрямую.

Каждый фрагмент обращается к этому объекту через свою модель. Таким образом, ни Фрагмент, ни его Presenter, ни Presenter Activity не имеют к нему прямого доступа.

Когда приложение уничтожается, компонент Dagger (сохраняющий экземпляр объекта) уничтожается. Когда пользователь возвращается в приложение, система пытается восстановить приложение в его предыдущем состоянии. Но поскольку Объект воссоздается с нуля, все данные, ранее введенные пользователем, теряются.

Как упоминалось в комментариях ниже, я должен использовать метод onSaveInstanceState, чтобы сохранить данные в пакете и восстановить их в onCreate. Но поскольку Activity и Object не могут напрямую общаться, как я должен этого добиться?

ОРИГИНАЛЬНЫЙ ВОПРОС

In all tutorials I have seen (e.g. this one), Dagger2's component is stored in the Application class as you generally need some objects to remains during the all life time of the app.

At the moment I have an Activity with multiple fragments. The Activity manages a form with several steps, each step being a Fragment.

My implementation follows the MVP design pattern. The data collected at each step of the form are stored in a unique object shared between Fragment's presenters. To manage it more easily and not have to pass the object to the next step manually, this object is directly injected to the Fragment presenter. This object has an @ActivityScope and is retains as long as the Activity remains.

As I'm using @Singletons (e.g. to keep Retrofit clients), the Activity component is a @Subcomponent of the global one, managed by the Application as described in the example.

EDITED

The problem I have, is when the app is stopped and the Application and Activity destroyed, when the app is restored, the Activity and Fragment I were on are restored too but I've lost all the data entered (as the Dagger component has been destroyed).

So I was wondering how I'm supposed to managed that?

Это звучит немного странно: «Приложение уничтожено, но не Действие». Действия живут в Приложении, они не могут существовать сами по себе.

Levi Moreira 11.04.2018 12:57

@LeviAlbuquerque Да, я ошибаюсь, похоже, что Activity тоже уничтожена. Но что происходит, так это то, что приложение восстанавливается до активности и фрагмента, в которых я был, когда покинул приложение. Итак, я нахожусь в середине формы, но я потерял все введенные данные

Eselfar 11.04.2018 13:01

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

Vasiliy 11.04.2018 13:11

Dagger не хранит данные за вас. Вам по-прежнему нужно использовать onSaveInstanceState для изменения конфигурации или записывать данные на диск (например, SharedPreferences), если вы хотите предотвратить их потерю.

David Medenjak 11.04.2018 16:53

Да, я это заметил, но как тебе это удается? В моем случае данные находятся в объекте, введенном в Модель. onSaveInstanceState находится в представлении, которое ничего не знает о модели. (Я следую шаблону проектирования MVP)

Eselfar 11.04.2018 17:00

Если вы не обрабатываете сохранение состояния должным образом, то либо шаблон проектирования, либо ваша его реализация неверны. Действие - это не представление, это точка входа в процесс. Вы не подчиняетесь контракту Activity (который должен показать ui и сохранить / восстановить состояние)

EpicPandaForce 12.04.2018 09:26

@EpicPandaForce Да, в моей реализации явно что-то не так. Как мне управлять onSaveInstanceState в структуре внедрения MVP +, не превращая мой код в невыносимый кошмар?

Eselfar 12.04.2018 12:11

Я могу порекомендовать эту библиотеку я написал специально для этого! : D, это позволяет вам сохранять состояние в Parcelable, поэтому даже логику сохранения состояния можно проверить. В конце концов, это ответственность ведущего. Восстановить состояние презентатора перед прикреплением к нему представления (если такое состояние существует).

EpicPandaForce 12.04.2018 12:21

@EpicPandaForce Это интересный подход, но он не решает мою проблему, даже если немного помогает. Как описано, у меня есть объект, в котором хранятся данные, введенные пользователем. Этот объект является общим для всех фрагментов процесса from (означает, что это один и тот же общий экземпляр). Этот объект остается, пока жив Activity. Он управляется Dagger2, что означает, что он не удерживается ни Activity, ни его Presenter. Он хранится в Activity Component by Dagger ...

Eselfar 12.04.2018 13:04

... Все фрагменты обращаются к этому объекту через свою модель, которая связана с их презентатором, а не напрямую с фрагментом. Фрагменты не должны управлять состоянием этого объекта. Я думаю, что его следует сохранять при вызове onSaveInstanceState Activity и восстанавливать в onCreate. Проблема в следующем: я не знаю, как уведомить этот объект о том, что ему необходимо сохранить данные в пакете действий (поскольку действие не связано с ним), и как их восстановить.

Eselfar 12.04.2018 13:04

Делегируйте вызов onSaveInstanceState() через систему. У вас есть attach/detach, не так ли? Также возьмите save/restore.

EpicPandaForce 12.04.2018 13:20

Да, в Activity Presenter. Но объект, который я хочу сохранить, не находится ни в Activity, ни в Presenter, несмотря на то, что он удерживается компонентом Dagger Activity (я обновил вопрос)

Eselfar 12.04.2018 13:25

Получите его и восстановите его состояние из Bundle, если применимо.

EpicPandaForce 12.04.2018 19:55

В качестве примечания: не оставляйте Retrofit как Singleton - используйте Reusable scope.

Piotr Aleksander Chmielowski 17.05.2018 09:15
0
14
429
0

Другие вопросы по теме