Android - Java - передать значения через намерения, связки или Parcelables?
Контекст:
Android
Я прочитал много примеров в сети для передачи данных между действиями.
Что я выучил:
- Передача примитивных данных через Intents (intent.putExtra(ключ, значение))
- Объедините примитивные данные и поместите их в intent.putExtra (ключ, объект связки)
- Parcelables -> для сложных объектов и примитивов.
Прежде чем вы скажете это, да, я, конечно, что-то упустил.
Вопрос:
Что ж, похоже, существует несколько способов достижения одной и той же цели.
Если я хочу передать пользовательский объект, Parcelable - мой мужчина. НО мне все равно придется его "сериализовать", так что в итоге у меня тоже будут примитивы, верно?
Для передачи примитивов зачем мне использовать связку, когда передача напрямую в намерении тоже сделает это?
Документация по Android / примеры форумов / блогов не сделали это для меня. Мой C-фон до сих пор немного сдерживает меня.
Кстати, зачем иметь 3 разных способа для достижения одной цели?
2 ответа
НО мне все равно придется его "сериализовать", так что в итоге у меня тоже будут примитивы, верно?
Почти все в Java в конечном итоге сводится к примитивам.
Для передачи примитивов зачем мне использовать связку, когда передача напрямую в намерении тоже сделает это?
В любом случае работает. Используйте то, что заставляет вас чувствовать себя более комфортно. Тем не менее, просто следите за коллизиями на ключах (например, ваши действия и некоторые базовые действия, от которых вы наследуете), пытаясь поместить одно и то же в один и тот же ключ Intent
или же Bundle
).
Кстати, зачем иметь 3 разных способа для достижения одной цели?
Я собираюсь догадаться, что "одна цель" - "передавать данные из одного вида деятельности в другой". Это включает межпроцессное взаимодействие (IPC), даже если эти два действия находятся в одном и том же процессе, так как процесс основной ОС участвует в маршрутизации. Почти все, кроме потоков от ContentProvider
в стандартном Android IPC означает, что данные должны быть помещены в Parcel
, который преобразуется в байтовый массив для передачи через границу процесса.
Parcelable
представляет интерфейс, который может быть добавлен в пользовательские классы, чтобы позволить им быть помещенными в Parcel
,
Bundle
это конкретный класс, который реализует Parcelable
и представляет собой HashMap
-подобная структура, но строго типизированная для вещей, о которых известно, что они могут войти в Parcel
, Bundle
удобнее, чем Parcel
для разработчиков, в том, что он предлагает произвольный доступ по ключу, где Parcel
не.
Intent
дополнительные просто Bundle
, для которого Intent
выставляет свои собственные методы доступа.
Для всех моих случаев я должен забыть о других возможностях и использовать только Parcelable?
AFAIK, что EpicPandaForce имел в виду, было сравнение между Serializable
а также Parcelable
, Любой может пойти в Bundle
или Parcel
, Из двух, при прочих равных, Serializable
медленнее, поскольку предполагает, что сериализованная форма должна быть прочной, способной к повторному считыванию через несколько месяцев или лет. Parcelable
предполагает, что все работают от одного и того же определения класса и могут обойти некоторые Serializable
накладные расходы в результате.
Это, как говорится, это микрооптимизация.
Почему другие все еще там?
Не все можно продлить Parcelable
, а именно java.*
классы. Integer
, например, не Parcelable
, Тем не менее, мы хотели бы иметь возможность пройти int
а также Integer
ценности вокруг. Следовательно, Parcel
опоры int
, так же как и Bundle
,
ты имеешь в виду, что я должен получить это обратно с вещью R.blah
AFAIK, в этом комментарии г-н Маркончини имел в виду "id" как общую концепцию, а не R.id
значения конкретно. Например, если вы поддерживаете кеш изображений, а не обмениваетесь фактическим Bitmap
объекты, передать некоторый идентификатор, который указывает обратно в кэш.
Использование Parcelable рекомендуется, если вы передаете объекты с не сериализуемыми. Это означает, что вы можете самостоятельно реализовать сериализованное представление ваших объектов, чтобы обеспечить передачу данных между операциями.
Если вы просто передаете простой идентификатор или строку вперед и назад, используйте intent.putExtra()
Я нашел эту статью по этой теме очень полезной, чтобы помочь понять различия и преимущества между вариантами: http://www.developerphil.com/parcelable-vs-serializable/