Шаг 255.
Основы Kotlin.
Первое Android-приложение на Kotlin. Сохранение состояния экземпляра

    На этом шаге мы рассмотрим реализацию указанного действия.

    Ваше приложение создания персонажа понемногу улучшается. Теперь вы можете нажать кнопку GENERATE и создать персонажа с характеристиками, которые вас устроят. Но есть одна проблема. Чтобы увидеть ее, запустите эмулятор, а затем сымитируйте поворот экрана телефона, щелкнув на значке поворота в окне инструментов эмулятора (рисунок 1).


Рис.1. Имитируем поворот экрана

    UI отобразит характеристики персонажа, отличные от полученных ранее, или вообще аварийно прекратит работу.

    Изменение данных в UI обусловлено особенностями работы жизненного цикла активности Android. Когда устройство поворачивается (в Android это называется изменением конфигурации устройства), Android уничтожает и снова создает активность с пользовательским интерфейсом, повторно вызывая функцию onCreate() нового экземпляра класса MainActivity.

    Один из способов исправить это недоразумение - перенести характеристики персонажа в следующий экземпляр активности, запомнив их в сохраненном состоянии экземпляра активности. В сохраненном состоянии экземпляра можно хранить данные, которые вы бы хотели использовать снова после повторного создания активности снова при изменении конфигурации объекта.

    Сначала добавьте в класс MainActivity вызов операции сериализации характеристик персонажа.

private const val CHARACTER_DATA_KEY = "CHARACTER_DATA_KEY"

class MainActivity : AppCompatActivity() {
    private var characterData = CharacterGenerator.generate()

    override fun onSaveInstanceState(savedInstanceState: Bundle) {
        super.onSaveInstanceState(savedInstanceState)
        savedInstanceState.putSerializable(CHARACTER_DATA_KEY, characterData)
    }

    .   .   .   .
}


Рис.2. Сериализация characterData (MainActivity.kt)

    Сериализация - это процесс, с помощью которого сохраняются объекты. В ходе сериализации объект преобразуется в базовые типы, такие как String или Int. Только сериализованные объекты могут храниться в Bundle.

    IntelliJ сообщите об ошибке в chacterData, так как вы пытаетесь передать несериализуемый объект в функцию putSerializable(). Чтобы исправить ошибку, надо добавить интерфейс Serializable в класс CharacterData - он станет сериализуемым.

.   .   .   .
object CharacterGenerator {
    data class CharacterData(val name: String,
                             val race: String,
                             val dex: String,
                             val wis: String,
                             val str: String) : Serializable
    .   .   .   .
}


Рис.3. Добавление поддержки сериализации в класс CharacterData (CharacterGenerator.kt)

    Функция onSaveInstanceState() вызывается один раз до того, как активность будет уничтожена. Она позволяет сохранить состояние активности в аргументе savedInstanceState типа Bundle.

    Вы добавили объект characterData в сохраненное состояние экземпляра, используя метод putSerializable(), который принимает ключ и экземпляр сериализуемого класса. Ключ - это константа, которая будет использована позже для извлечения сериализованного значения - экземпляра класса CharacterData, который вы расширили реализацией интерфейса Serializable.

    На следующем шаге мы рассмотрим чтение сохраненного состояния экземпляра.




Предыдущий шаг Содержание Следующий шаг