Как работает parcelable android

Содержание
  1. Parcelable. Передаём объекты
  2. Parcelable в Android с помощью Kotlin?
  3. Полный список
  4. Русские Блоги
  5. Подробно расскажем о принципе и использовании Parcelable в Android
  6. оглавление
  7. 1.1 Краткое введение в Parcelable
  8. 1.2 Введение в посылку
  9. 1.3 Введение в три основных процесса в Parcelable (сериализация, десериализация, описание)
  10. 1.3.1 Описание
  11. 1.3.2 Сериализация
  12. 1.3.3 Десериализация
  13. 2. Внедрение и использование Parcelable
  14. 3. Обработка объектов и коллекций в Parcelable
  15. 4. Разница и сравнение между Parcelable и Serializable
  16. Интеллектуальная рекомендация
  17. Используйте шаблон состояния вместо if else
  18. Проектирование архитектуры: схема проектирования уровня балансировки нагрузки (5) — установка одного узла LVS
  19. Рыба образования, средняя школа закончила в учебном класс, как найти первую работу.
  20. Синглтон паттерн в питоне
  21. Java Counce Collection
  22. Вам также может понравиться
  23. динамический прокси-сервер jdk (Proxy, InvocationHandler), включая исходный код $ Proxy0
  24. Юля: Об изменениях в Array 1.0
  25. студия Android генерирует статическую библиотеку jni
  26. Nginx 502 раствор
  27. Java вызывает SMS-интерфейс WebService

Parcelable. Передаём объекты

Очень часто программисту приходится передавать данные из одной активности в другую. Когда речь идёт о простых типах, то используется метод intent.putExtra() и ему подобные. Данный способ годится для типов String, int, long или массивов. А вот объекты таким образом передать не получится.

В Java существует специальный интерфейс Serializable, но он оказался слишком неповоротлив для мобильных устройств и пользоваться им настоятельно не рекомендуется. Для передачи объектов следует использовать другой интерфейс Parcelable.

В интерфейсе Parcelable используются два метода describeContents() и writeToParcel():

Метод describeContents() описывает различного рода специальные объекты, описывающие интерфейс.

Метод writeToParcel() упаковывает объект для передачи.

Также необходимо реализовать статическое поле Parcelable.Creator CREATOR, которое генерирует объект класса-передатчика.

Напишем пример. Попробуем передать объект «Мои документы». Как известно, признаком настоящего документа являются Усы, лапы, хвост (я ещё добавил бы имя). Создадим новый класс DocumentInfo, который реализует интерфейс Parcelable:

Теперь мы может передать объект через Intent. Создадим две активности. В первой активности напишем код для отправки объекта:

Вторая активность должна принять данные от первой активности:

Получив объект из первой активности, мы можем извлечь необходимые данные и разложить по полочкам.

Если класс слишком большой, то вручную его переделывать утомительно. Существует онлайн-сервис parcelabler а также плагин для Android Studio mcharmas/android-parcelable-intellij-plugin: IntelliJ Plugin for Android Parcelable boilerplate code generation.

Источник

Parcelable в Android с помощью Kotlin?

В настоящее время я использую превосходный AutoParcel в своем проекте Java, который облегчает создание классов Parcelable.

Теперь у Kotlin, который я рассматриваю для моего следующего проекта, есть концепция классов данных, которые автоматически генерируют методы equals, hashCode и toString.

Есть ли удобный способ сделать класс данных Kotlin Parcelable удобным способом (без реализации методов вручную)?

Плагин Android Extensions теперь включает в себя автоматический генератор реализации Parcelable. Объявите сериализованные свойства в первичном конструкторе и добавьте аннотацию @Parcelize, и методы writeToParcel ()/createFromParcel () будут созданы автоматически:

Поэтому вам нужно разрешить им добавить это в build.gradle вашего модуля:

Вы можете попробовать этот плагин:

Это поможет вам сгенерировать стандартный Android Parcelable код для класса данных kotlin. И наконец это выглядит так:

Вы пробовали PaperParcel ? Это процессор аннотаций, который автоматически генерирует шаблонный код Android Parcelable для вас.

Использование:

Аннотируйте свой класс данных с помощью @PaperParcel , реализуйте PaperParcelable и добавьте статический экземпляр JVM сгенерированного CREATOR , например:

Теперь ваш класс данных Parcelable и может быть передан непосредственно в Bundle или Intent

Edit: Обновление с последним API

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

И это все. Работает и для закрытых классов. Также этот плагин обеспечивает проверку времени компиляции для всех классов AutoParcelable.

UPD 17.08.2017 Теперь с Kotlin 1.1.4 и плагином расширений Kotlin для Android вы можете использовать аннотацию @Parcelize . В этом случае приведенный выше пример будет выглядеть так:

Нет необходимости в модификаторе data . Самым большим недостатком на данный момент является использование плагина kotlin-Android-extensions, который имеет множество других функций, которые могут быть ненужными.

Просто нажмите на ключевое слово data вашего класса данных kotlin, затем нажмите alt + Enter, выберите первый вариант, скажем «Add Parceable Implementation»

Я оставлю свой способ делать, если это может кому-то помочь.

Что я делаю, у меня есть универсальный Parcelable

А потом я создаю такие посылки, как это:

Который избавляет меня от этого переопределения.

К сожалению, в Kotlin нет способа поместить настоящее поле в интерфейс, поэтому вы не можете наследовать его от интерфейсного адаптера бесплатно: data class Par : MyParcelable

Читайте также:  Где папка андроид клонов

Вы можете посмотреть на делегирование, но это не помогает с полями, AFAIK: https://kotlinlang.org/docs/reference/delegation.html

Таким образом, единственная опция, которую я вижу, это функция фабрики для Parcelable.Creator , что довольно очевидно.

Используя Android Studio и плагин Kotlin, я нашел простой способ конвертировать мои старые Parcelable s Java с без дополнительных плагинов (если все, что вам нужно, это превратить новый класс data в Parcelable , переходите к 4-му фрагменту кода).

Допустим, у вас есть класс Person со всей табличкой Parcelable :

Начнем с удаления реализации Parcelable , оставив простой, простой, старый объект Java (свойства должны быть окончательными и устанавливаться конструктором):

Затем пусть опция Code > Convert Java file to Kotlin File сделает свое дело:

Преобразуйте это в класс data :

И, наконец, давайте снова превратим это в Parcelable . При наведении курсора на имя класса и Android Studio вы можете указать Add Parcelable Implementation . Результат должен выглядеть так:

Как видите, реализация Parcelable — это некий автоматически сгенерированный код, добавленный к определению класса data .

Заметки:

  1. Попытка конвертировать Java Parcelable непосредственно в Kotlin не даст тот же результат с текущей версией плагина Kotlin ( 1.1.3 ).
  2. Мне пришлось удалить некоторые дополнительные фигурные скобки, которые представляет текущий генератор кода Parcelable . Должно быть небольшая ошибка.

Я надеюсь, что этот совет работает для вас так же, как и для меня.

Источник

Полный список

— добавляем объекту поддержку Parcelable
— передаем с помощью Intent

С Parcel мы немного поработали на прошлом уроке. Этих знаний хватит, чтобы понять, как реализовать в своем объекте интерфейс Parcelable. Создадим свой объект, реализуем в нем интерфейс Parcelable и попробуем передать в другое Activity через Intent.

Project name: P0691_Parcelable
Build Target: Android 2.3.3
Application name: Parcelable
Package name: ru.startandroid.develop.p0691parcelable
Create Activity: MainActivity

В strings.xml пропишем тексты:

В main.xml нарисуем кнопку:

Перед тем как кодить MainActivity.java, создадим свой объект для передачи MyObject.java:

Объект сам по себе несложный: пара переменных s и i, и конструктор. Все остальное используется для реализации Parcelable. Давайте смотреть.

Про метод describeContents ничего сказать не могу. Я не понял, зачем он нужен.

В методе writeToParcel мы получаем на вход Parcel и упаковываем в него наш объект. Т.е., в нашем случае, помещаем туда переменные s и i. flags не используем.

CREATOR типа Parcelable.Creator используется для создания экземпляра нашего MyObject и заполнения его данными из Parcel.

Для этого используется его метод createFromParcel, который мы должны реализовать. На вход нам дается Parcel, а вернуть мы должны готовый MyObject. В нашем примере мы используем здесь конструктор MyObject(Parcel parcel), который реализован чуть дальше.

Смысл метода newArray остался для меня непонятен.

Конструктор MyObject(Parcel parcel) принимает на вход Parcel и заполняет объект данными из него. Этот метод использовался нами чуть ранее в CREATOR.createFromParcel.

Создадим второе Activity, в которое будем передавать объект.

Сначала создаем экран second.xml:

Мы вытаскиваем наш MyObject-объект из Intent и в лог выводим значения s и i.

Создаем Intent, помещаем туда объект MyObject. В качестве ключа используем его имя класса (разумеется, это необязательно, вы можете свое имя использовать). И отправляем Intent с вызовом SecondActivity.

Все сохраним и запустим приложение.

Жмем Send, Intent уходит в SecondActivity

MyObject(String _s, int _i)
startActivity
writeToParcel
getParcelableExtra
createFromParcel
MyObject(Parcel parcel)
myObj: text, 1

Сначала вызвался конструктор MyObject(String _s, int _i) – это мы создали myObj.

startActivity – начинаем вызов Activity

writeToParcel — мы поместили объект в Intent, и похоже, что при отправке он упаковался в Parcel. Т.к. сам Parcel не знает, как именно упаковать объект, он вызвал метод writeToParcel, где мы реализовали упаковку.

getParcelableExtra – извлекаем объект из Intent

createFromParcel – это был вызван метод CREATOR.createFromParcel, которому на вход дали Parcel, а он должен вернуть MyObject. Этот метод в свою очередь для создания MyObject использует конструктор MyObject(Parcel parcel), в котором мы расписали, как надо читать Parcel и заполнить объект.

myObj: text, 1 – вывели в лог значения объекта.

Итак. Чтобы нам передать объект через Intent, нам надо реализовать в нем интерфейс Parcelable. В этом случае Intent без проблем запакует, передаст и распакует наш объект. И я так подозреваю, что делает он это с помощью Parcel. Т.е. в реализации интерфейса Parcelable мы полностью описываем алгоритм упаковки и распаковки объекта, а Parcel эти алгоритмы потом использует. Т.к. сам он не может знать, как правильно распаковать и создать передаваемый объект.

Читайте также:  Android background color setting

Если кто разберется, зачем нужны непонятые мною методы – пишите на форуме в ветке этого урока. Я добавлю вашу инфу в урок.

На следующем уроке:

— сохраняем данные при повороте экрана

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Русские Блоги

Подробно расскажем о принципе и использовании Parcelable в Android

оглавление

  1. Краткое введение в Parcelable
    1.1 Введение в Parcelable
    1.2 Введение в посылку
    1.3 Введение в три основных процесса в Parcelable (сериализация, десериализация, описание)
  2. Использование посылки и интерпретация исходного кода
  3. Обработка предметов и коллекций в Parcelable
  4. Разница и сравнение между Parcelable и Serializable

1.1 Краткое введение в Parcelable

Представляя Parcelable, я должен сначала упомянуть интерфейс Serializable. Serializable — это стандартизированный интерфейс сериализации, предоставляемый Java. Так что же такое сериализация? — Проще говоря, это процесс преобразования объекта в двоичный поток (двоичная последовательность), который можно передавать, чтобы мы могли сериализовать его в поток (последовательность), который можно передавать по сети или сохранять локально, чтобы передавать данные , Десериализация — это процесс преобразования двоичного потока (последовательности) в объект.

Parcelable — это сериализованный интерфейс, предоставляемый Android. Использование Parcelable относительно сложнее, чем Serializable, но эффективность Parcelable намного выше, чем у Serializable. Это всегда была гордость инженеров Google. Если у вас есть время, вы можете взглянуть на Parcelable. Сравнение эффективности с SerializableParcelable vs SerializableЗаявленная эффективность в 10 раз выше

Тогда давайте посмотрим на Parcelable в исходном коде Android

Из введения в исходный код мы можем узнать, что класс реализации интерфейса Parcelable может записывать и восстанавливать данные через Parcel, и должна быть непустая статическая переменная CREATOR, и приведен пример, чтобы мы могли написать ее относительно просто , Но простое использование не является нашей конечной целью

Глядя на Parcelable в исходном коде Android, можно увидеть, что процесс реализации Parcelable в основном делится на Сериализация, десериализация, описание Три процесса, три процесса представлены ниже

1.2 Введение в посылку

Перед введением нам нужно понять, что такое Parcel. В переводе «Parcel» подразумевается упаковка, фактически она состоит в том, чтобы упаковать данные, которые нам необходимо передать, и затем передать их в Binder, который используется для передачи данных между процессами.

Проще говоря, Parcel предоставляет механизм, который может записывать сериализованные данные в общую память, а другие процессы могут считывать байтовые потоки из этой общей памяти через Parcel и десериализовать их в объекты. Диаграмма является моделью этого процесса.

Parcel может содержать примитивные типы данных (записанные с помощью различных соответствующих методов, таких как writeInt (), writeFloat () и т. Д.), Может содержать объекты Parcelable, а также содержит ссылку на активный объект IBinder, что приводит к получению другого конца Для прокси IBinder, указывающего на этот IBinder.

Parcelable реализует методы чтения и записи через Parcel для достижения сериализации и десериализации. Давайте посмотрим на исходный код

Можно видеть, что включены различные методы чтения и записи, и в конечном итоге они реализуются с помощью собственных методов.

1.3 Введение в три основных процесса в Parcelable (сериализация, десериализация, описание)

К этому моменту, в основном, отношения были прояснены, а также понятны простое введение и принцип. Далее, перед реализацией Parcelable, я представлю три основных процесса реализации Parcelable.
Сначала напишите класс, который реализует интерфейс Parcelable, который позволит нам реализовать два метода

1.3.1 Описание

Среди них, descriptionContents отвечает за описание файлов, сначала посмотрите на интерпретацию исходного кода.

Из приведенного выше описания видно, что только для некоторых специальных объектов, которые должны описывать информацию, необходимо возвращать 1, а в других случаях возвращать 0.

1.3.2 Сериализация

Мы реализуем сериализацию с помощью метода writeToParcel, а writeToParcel возвращает Parcel, поэтому мы можем напрямую вызывать метод записи в Parcel. Существуют базовые методы записи. Объекты и коллекции являются специальными. Давайте поговорим об этом отдельно. Базовые типы данных доступны, кроме логических. Boolean может использовать int или byte storage

Например: мы сериализуем объект User выше, объект User содержит три поля age, name, isMale

Читайте также:  Tar bz2 распаковать android

1.3.3 Десериализация

Для десериализации необходимо определить переменную CREATOR. Конкретный метод также упоминается выше. Здесь вы можете напрямую скопировать пример, приведенный в Android, или определить его самостоятельно (имя не должно быть изменено) и реализовать Parcelable в анонимном внутреннем классе. Интерфейс создателя

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

2. Внедрение и использование Parcelable

В соответствии с введением вышеупомянутых трех процессов, Parcelable завершен и может быть передан непосредственно в Intent. Вы можете самостоятельно написать два действия для передачи данных и попробовать их, одно из которых — putExtra, а другое — getParcelableExtra.

Здесь также очень просто реализовать Parcelable.

1. Напишите класс для реализации Parcelable, а затем alt + enter, чтобы добавить блок кода, требуемый для Parcelable, AndroidStudio автоматически реализует его для нас (здесь вам нужно обратить внимание, если он содержит объекты или коллекции, вам нужно реализовать Parcelable)

3. Обработка объектов и коллекций в Parcelable

Если объект, реализующий интерфейс Parcelable, содержит объект или коллекцию, тогда объект также должен реализовывать интерфейс Parcelable.
Если вы включите объект Author и collection:

Содержит объект Author и коллекцию Author

Прежде всего, Author должен сначала реализовать Parcelable, и шаги реализации не будут опубликованы. Как и обычные объекты, реализованы три процесса.

Для реализации сериализации и десериализации вышеуказанного объекта Book:

Есть два способа написать и прочитать сборник,
Один из них — написать соответствующую информацию о классе, а затем прочитать ее через загрузчик классов, -> writeList | readList
Второе — создать без информации, связанной с классом, передать в CREATOR связанного класса при создании -> writeTypeList | readTypeList | createTypedArrayList
Второй более эффективен

Следует отметить, что если существует определение коллекции, оно должно быть инициализировано следующим образом ->
public ArrayList authors = new ArrayList<>();

4. Разница и сравнение между Parcelable и Serializable

И Parcelable, и Serializable реализуют сериализацию и могут быть использованы для передачи данных между Intents.Serializable — это метод реализации Java, который может потребовать частых операций ввода-вывода, поэтому потребление относительно велико, но метод реализации прост. Высокий, но его сложнее реализовать. Правила выбора для них следующие: Выберите Parcelable для сериализации памяти и выберите Serializable для хранения на устройстве или по сети. (Конечно, Parcelable также может быть использован, но это немного сложнее)

Интеллектуальная рекомендация

Используйте шаблон состояния вместо if else

Большинство разработчиков все еще используютif elseСтруктура процесса, виделиjdonизbanqСтатья написана Большим Братом, используяcommand,aopЗамена шаблонаif elseСтруктура процесса. Я не совсем понял эт.

Проектирование архитектуры: схема проектирования уровня балансировки нагрузки (5) — установка одного узла LVS

1 Обзор Предыдущая статья «Проектирование архитектуры: проектирование уровня балансировки нагрузки (4) — Принципы LVS» (http://blog.csdn.net/yinwenjie/article/details/46845997), мы предста.

Рыба образования, средняя школа закончила в учебном класс, как найти первую работу.

Self-брат Я девять ноль, теперь занимается разработкой веб-конца Java. Некоторое понимание и восприятие учебных курсов. Учебное заведение является ямой, дорога, что вы уже прошли, только вы знаете, дл.

Синглтон паттерн в питоне

Дизайн шаблона Шаблон дизайна — это краткое изложение предыдущей работы, которое, как правило, широко распространено людьми и является зрелым решением конкретной проблемы. Он предназначен для многораз.

Java Counce Collection

TRUEEWAP основан на реализации красных навигаций. Это отображение отсортировано в соответствии с его природооформленным порядком или отсортировано в соответствии с компаратором, предусмотренным при со.

Вам также может понравиться

динамический прокси-сервер jdk (Proxy, InvocationHandler), включая исходный код $ Proxy0

1. Связанные классы и методы: java.lang.reflect.Proxy, Прокси предоставляет статические методы для создания динамических прокси-классов и экземпляров. newProxyInstance() Возвращает экземпляр прокси-кл.

Юля: Об изменениях в Array 1.0

Версии до 1.0, например 0.2-0.6, Но теперь 1.0 это сообщит об ошибке. Это использование претерпело серьезные изменения! такие как: Это можно считать серьезным изменением.

студия Android генерирует статическую библиотеку jni

Android Сяобай, который только что вошел в общество, описывает, как использовать студию Android для создания статической библиотеки jni. 1. Подготовка: Сначала установите ndk, сначала сами Baidu, позж.

Nginx 502 раствор

Общие решения Nginx 502 Bad Gateway следующие: Nginx 502 Ошибка 1: Количество сайтов велико, а количество PHP-CGI мало. Для этой 502 ошибки просто увеличивайте количество процессов PHP-CGI. В частност.

Java вызывает SMS-интерфейс WebService

1. Описание интерфейса WebService Отправьте в виде http-сообщения, выше — информация о запросе, а ниже — возвращаемое значение. Представлен раздел возвращаемого значения документа интерфейса. 2. Код J.

Источник

Оцените статью