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/

Другие вопросы по тегам