#android #kotlin #android-lifecycle
#Android #kotlin #android-жизненный цикл
Вопрос:
Внутри моего Activity
я использую Fragment
с флагом retainInstance
, установленным как true, для хранения экземпляра моего класса уровня представления. Это работает достаточно хорошо, чтобы пережить изменения вращения.
var retainedFragment = supportFragmentManager.findFragmentByTag(retainedTag)
if (retainedFragment == null) {
retainedFragment = BaseRetainedFragment<P>()
supportFragmentManager.beginTransaction()
.add(retainedFragment, retainedTag).commit()
presenter = getPresenter()
retainedFragment.setPresenter(presenter)
fragment = retainedFragment
} else {
presenter = (fragment as BaseRetainedFragment<P>).getPresenter()
}
* внутри Fragment
у меня есть lateinit
свойство presenter
Проблема заключается в том, что когда дело доходит до уничтожения Activity
в фоновом режиме Android, потому что, как вы можете видеть, я проверяю, существует ли на самом деле экземпляр my Fragment
. После завершения процесса Android в фоновом режиме, когда приложение будет повторно открыто, оно найдет Fragment
этот тег, но мое свойство не будет инициализировано (оно было очищено).
Я смог избавиться от сбоя, сохранив мой Fragment
inside savedInstanceState
внутри Activity
, но все еще не получаю свой предыдущий экземпляр Presenter
. Я не могу позволить себе внедрить Parcelable
в свой Presenter
и сохранить его экземпляр внутри Fragment
.
Есть ли способ восстановить экземпляр моего класса из сохраненного фрагмента? Или даже объект с состоянием?
Примечание: Я пытался сохранить только свое состояние как Parcelable
но я получаю Type inference fail
все время, когда пытаюсь получить savedInstanceState.getParcelable(key)
.
PS любое другое предложение о сохранении состояния, когда activity
уничтожается в фоновом режиме, будет оценено по достоинству
Комментарии:
1. Если вы не хотите внедрять parceable, просто добавьте «serializable» к реализации, и это позволит вам сохранять и извлекать его без переопределения реализации parceable, которого вы, вероятно, хотите избежать. объект немного больше, но этого недостаточно, чтобы заметить в настоящее время.
Ответ №1:
Я решил сохранить свое последнее ViewState
использование Bundle
внутри моего retained fragment
. Работает круто, но, конечно, имеет свои минусы — мне приходится добавлять @Parcelize
к каждому своему ViewState
классу, а также это становится сложнее, когда внутри него больше заданных типов (для чего требуется пользовательская Parceler
реализация).
Итак, теперь я создаю новый экземпляр Presenter
, но сразу же нажимаю init ViewState
, который является моим предыдущим последним.