Смотрите видеоурок бесплатно на удобной для вас платформе:
Интерфейс Parcelable в Kotlin / Android
Parcelable, с другой стороны, является более эффективным инструментом, который разработан специально для Android. Он работает, создавая объект Parcelable, который может быть сохранен или передан в виде аргумента между компонентами приложения, используя методы writeParcelable и readParcelable. Это позволяет сериализовать объекты быстрее и более эффективно, чем Serializable, поскольку Parcelable не создает копию объекта в памяти и не требует такого количества ресурсов.
Способы реализации Parcelable
Теперь реализуем этот интерфейс, и здесь реализация будет разделена на 2 типа. С ручной реализацией методов Parcelable и с помощью дополнительной библиотеки.
Способ 1: с ручной реализацией методов Parcelable
Начнем со стандартного способа. Скопирую наш класс и закомментирую предыдущий пример, чтобы не отвлекал. Наследуемся от интерфейса Parcelable
. Наводимся на ошибку и видим сообщение, что класс теперь обязан реализовать методы интерфейса.
Кроме того там идет речь про то, что класс ExtraWord реализует интерфейс Parcelable, но не предоставляет поле CREATOR.
Воспользуемся предложением AndroidStudio имплементировать необходимые методы прямо из всплывашки или же через контекстное меню. Добавляем оба.
Данный способ ручной реализацией методов интерфейса с одной стороны позволяет гибко настроить сериализацию и десериализацию. С другой стороны требует прям много кода от разработчика. Давайте вместе напишем все необходимое, чтобы если вы в своих рабочих или учебных проектах встретились с таким кодом – смогли в нем ориентироваться.
- Метод
describeContents
используется для описания специфического содержимогоParcelable
. Обычно возвращает0
, если нет такого содержимого – это как значение по умолчанию. - Метод
writeToParcel
сериализует объект, записывая его данные вParcel
для передачи. Для каждого свойства класса прописываем метод по его типу за исключением Boolean. В нем будем передавать 1 или 0 в зависимости от значения. - Далее нам понадобится конструктор для восстановления объекта из
Parcel
, который содержит сериализованные данные. Обращаюсь к объекту и присваиваю свойствам класса полученные данные. И еще в моем случае нужно привести все к строке, чтобы убрать ошибку. - Наконец, обязательным действием при реализации интерфейса
Parcelable
является добавление объектаCREATOR
. Этот объект помогает системе Android восстанавливать ваш объект изParcel
. После наследования от нужного нам класса получаем аналогичное уведомление о необходимости имплементировать 2 метода, необходимые для создания объектов из сериализованной формы. Сделаем это через контекстное меню. МетодcreateFromParcel
отвечает за создание экземпляра класса ExtraWord из объектаParcel
. Когда Android передает данные между компонентами, он преобразует их в Parcel, и этот метод восстанавливает объект. Здесь создается наш объектExtraWord
, который принимаетParcel
в качестве параметра конструктора. МетодnewArray
используется для создания массива объектов класса ExtraWord. В данном случае будем возвращать массив, заполненныйnull
. Метод используется, когда требуется массив объектов, например, для передачи нескольких объектов сразу.
Готово. Теперь как это работает все вместе:
- Здесь объект
word
сериализуется вParcel
с помощью методаwriteToParcel()
и добавляется вIntent
. - В второй Activity система вызывает метод
createFromParcel()
из объектаCREATOR
, который восстанавливает объектExtraWord
изParcel
.
Вот и все, в целом, если пошагово разобраться все выглядит не так уж и страшно. Как и все программирование. Получилось довольно громоздко, но следующий способ вас приятно удивит.
Получение Parcelable объекта
Чтобы получить объект сделаем примерно все то же самое, скопирую и закомментирую предыдущую реализацию. Основное отличие в том, что из интента получаем данные с помощью метода getParcelableExtra. И второе это то, что приведение типа не сработает, поэтому уберу это и добавлю оператор null safety при обращении к объекту. Все остальное работает штатно, поэтому можно проверять. Переданное слово отображается успешно.
Способ 2: с помощью плагина kotlin-parcelize
Следующий способ использования Parcelable гораздо комфортнее в использовании, так как весь код, который мы вынуждены были имплементировать выше, будет сгенерирован под капотом с помощью плагина kotlin-parcelize.
Чтобы это сделать я скопирую класс, сохранив наследование интерфейса Parcelable. Но дополнительно к классу нужно добавить аннотацию @Parcelize
. Как видите среда разработки не находит эту аннотацию – необходимо подключить плагин в градл файле. Перемещаемся туда.
Подключание плагина kotlin-parcelize
Я могу написать его напрямую. Плагин автоматически поставляется Kotlin плагином, поэтому здесь нам достаточно только его включить id("kotlin-parcelize")
– и все заработает.
Возвращаемся в Активити и импортируем аннотацию в файл, нужно добавлять аннотацию именно из пакета kotlinx.parcelize
. Отлично, ошибка ушла, во второй Активити ничего менять не нужно. Проверяем, что все работает также, как и задумано.
Способ хоть и требует дополнительного действия в виде подключения плагина, но выигрывает по производительности и в целом был создал специально под Android. Я бы рекомендовал его использовать в большинстве случаев.
Для тех, кто собрался стать Android-разработчиком
Пошаговая
схема
Описание процесса обучения от основ Kotlin до Android-разработчика
Бесплатные
уроки
Авторский бесплатный курс по основам языка программирования Kotlin
Обучающий
бот
Тренажер и самоучитель по Котлин – бесплатные тесты и практика