Google Android - это несложно • Просмотр темы - Урок 69. Передаем Parcelable объекты с помощью Intent

Google Android - это несложно

Добро пожаловать на форум сайта startandroid.ru
Текущее время: 15 авг 2018, 04:50

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 11 апр 2012, 23:00 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
В этом уроке:

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

[url=http://www.startandroid.ru/ru/uroki/vse-uroki-spiskom/132-urok-69-peredaem-parcelable-obekty-s-pomoschju-intent.html:21yetxcg]Click here to read this article![/url:21yetxcg]

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Последний раз редактировалось damager82 12 май 2017, 12:06, всего редактировалось 6 раз(а).

Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 11:15 

Зарегистрирован: 12 янв 2012, 12:38
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Спасибо, неплохие уроки. Внесу от себя поправку, у меня была задача передавать объекты между активити, так вот сначала я наткнулся на этот Parcelable и немного на нем подвис, так как его применения показалось мне сложным, потому я начал юзать старый, добрый, джавовский сериалайзбл, который работает лучше и проще (имхо). Ну и одно замечание к статье - зачем писать, что какой-то метод для тебя остался загадкой?, если можно его проверить в документации

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


Цитата:
abstract int describeContents()
Describe the kinds of special objects contained in this Parcelable's marshalled representation.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 11:33 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Gorets писал(а):
зачем писать, что какой-то метод для тебя остался загадкой?, если можно его проверить в документации

А потом меня кто-нить попросит объяснить подробней и мне нечего будет сказать. Мне это описание ни о чем не сказало. Я не понял как и для каких целей я могу использовать этот метод.

Если у вас есть примеры использования и вы понимаете смысл этого метода - пишите их сюда, я добавлю в урок эти сведения.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 13:08 

Зарегистрирован: 12 янв 2012, 12:38
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Я не правильно выразился, т.е. я хотел сказать, что "неплохо то что ты так это описываешь", а плохо, то что такие фразы могут подтолкнуть новичков на мысли типа, если тут в тутореале говорят, что не знают, значит про это вообще негде не сказано...
Как я понял его назначение. Метод предназначен для описания специальных случаев сериализации\десериализации объекта, например, его стоит переопределять в объектах наследниках, что бы метод Parcelable.Creator<MyParent> CREATOR знал какой объект возвращать. =) наверно, слабоватый с меня объяснитель получился в этом вопросе =). Ну относительного примера в статье.


public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
// распаковываем объект из Parcel

public MyParent createFromParcel(Parcel in)
{
Log.d(LOG_TAG, "createFromParcel");
int description=in.readInt(); // получаем description
Serializable s=in.readSerializable(); // считываем собственно наш объект
switch(description)
{ // приводим к нужному типу или кастомизируем как хочется и возвращаем готовый объект
case 1:
return (MyObjectChild1)s;
case 2:
return (MyObjectChild2)s;
default:
return (MyObject)s;
}


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 13:57 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Я натыкался на этот ответ. Вы забыли упомянуть, в примере, про то, какую роль здесь играет describeContents().
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. //need to be overwritten in child classes
  2. //MyChild_1 - return 1 and MyChild_2 - return 2
  3. public int describeContents() {return 0;}
  4.  
  5. public void writeToParcel(Parcel out, int flags)
  6. {
  7.     out.writeInt(this.describeContents());
  8.     out.writeSerializable(this);
  9. }
  10.  
Честно говоря, это как-то... не элегантно. С тем же успехом можно было использовать константу. В комментариях к ответу, кстати, про это говорится. Там-же есть ссылка на, якобы, "правильный" ответ (ПРАВИЛЬНЫЙ ОТВЕТ).
Я с английским не очень дружу, поэтому так и не смог понять зачем это все-таки нужно.

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 14:23 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
KamiSempai писал(а):
не смог понять зачем это все-таки нужно.

Я тоже видел эту ссылку. Там написано, что флаг CONTENTS_FILE_DESCRIPTOR используется в методе describeContents при передаче через Parcel объекта FileDescriptor.
Возможно внутри Parcel-а читается этот describeContents и от этого зависит, как будет храниться объект.

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 15:01 
Аватар пользователя

Зарегистрирован: 17 фев 2012, 21:23
Сообщений: 1339
Откуда: Мордор
Благодарил (а): 16 раз.
Поблагодарили: 161 раз.
Значит я понял правильно. Только все равно ни чего не понятно :)

_________________
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 12 апр 2012, 16:44 

Зарегистрирован: 12 янв 2012, 12:38
Сообщений: 8
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
остановимся на выводе
"This whole Parceable functionality looks unfinished (read: has bad design)." =)))


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 26 май 2012, 13:07 

Зарегистрирован: 26 мар 2012, 12:51
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
странно но у меня форсклоз после лога writeToParcel ... хотя все сопипастил точно...


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 май 2012, 09:38 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
irukanji писал(а):
странно но у меня форсклоз после лога writeToParcel ... хотя все сопипастил точно...


А что говорит в логах и на какую строку ругается?

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 май 2012, 18:15 

Зарегистрирован: 26 мар 2012, 12:51
Сообщений: 12
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
я наверное забыл в манифест прописать активити


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 30 май 2012, 23:36 

Зарегистрирован: 30 май 2012, 23:06
Сообщений: 41
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Второй метод, по моему предположению, нужен для работы с массивами. Ведь парсить можно не только сам объект, но и массив таких объектов. Если бы я был парсером, то при восстановлении массива объектами мне нужно было:
1) создать сам массив объектов
2) заполнить этот массив значениями

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


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 май 2012, 08:38 

Зарегистрирован: 30 май 2012, 23:06
Сообщений: 41
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Спасибо за хорошие уроки. Смотрел много книг и блогов по разработке под Андрюше, но как-то желаемого не получил. А тут все понятно, достаточно добродно.

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

должны быть. Конструкция действительно не однозначная, и когда человек видит эти слова, он понимает, что он все понял правильно. Во всяком случае читатель не будет чувствовать себя дураком из-за того, что не понял то, что ему собственно нормально не объяснили.
Так что не слушайте Горца.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 31 май 2012, 16:44 
Администратор
Аватар пользователя

Зарегистрирован: 07 янв 2012, 11:32
Сообщений: 1400
Благодарил (а): 0 раз.
Поблагодарили: 75 раз.
Prospekt писал(а):
Второй метод, по моему предположению, нужен для работы с массивами.


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

_________________
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 11 июн 2012, 13:50 

Зарегистрирован: 30 май 2012, 23:06
Сообщений: 41
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Цитата:
Второй метод, по моему предположению, нужен для работы с массивами. Ведь парсить можно не только сам объект, но и массив таких объектов. Если бы я был парсером, то при восстановлении массива объектами мне нужно было:
1) создать сам массив объектов
2) заполнить этот массив значениями

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


Как это обычно и бывает, я оказался прав. Все дело в том,, что парсеру при сборе объекта нужно вернуть массив некоторого типа (если конечны сам объект содержит массивы), поэтому это массив нужно создать.

Есть такое ограничение языка java, как невозможность создавать экземпляры и массивы экземпляров параметрических классов. Т.е. вот так сделать нельзя:
Код: [ Загрузить ] [ Скрыть ]
Using Text Syntax Highlighting
  1. class Creator<T>{
  2.     public T item;
  3.     public T[] data;
  4.  
  5.     public Creator() {
  6.         item = new T();
  7.         data = new T[5];
  8.     }
  9. }


То, что у класса T может и не быть пустого конструктора - это понятно. Но вот то, что нельзя создавать массивы параметрического класса - это для меня в некотором смысле новость.

Отсюда очевидно, что второй метод - это не прихоть разработчиков, это как говорится осознанная необходимость. У Parcelable просто нет других вариантов, поэтому создавать объекты и массивы поручили нам. А то, что сам Parcelable вынужден работать с классом-параметров наверное объяснять не надо.

PS: Приятно сделать интуитивное предположение, а потом его же и подтвердить. Придется себя похвалить. :)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 окт 2012, 14:34 

Зарегистрирован: 12 авг 2012, 22:13
Сообщений: 11
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Добрый день, подскажите, а как передать к примеру коллекцию объектов? Спасибо.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 28 окт 2012, 14:49 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
dim_ писал(а):
Добрый день, подскажите, а как передать к примеру коллекцию объектов? Спасибо.

смотря каких объектов, если int или String то у Intent есть два метода putIntegerArrayListExtra, putStringArrayListExtra.
Если же своих объектов, то: putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)
Так же есть альтернативные велосипеды:
1) Делаем класс контейнер-упаковщик, в котором храним наш ArrayList;
2) Создаём класс который extends ArrayList implements Parcelable и упаковываем его;

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 18 янв 2013, 16:31 
Аватар пользователя

Зарегистрирован: 29 окт 2012, 16:45
Сообщений: 10
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Мне нужно передать Список своих объектов.
Для этого, собственно, создал класс:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1. public class  music implements Parcelable{
  2.         private String name;
  3.         private String link;
  4.         private boolean box;
  5.         music(String _name,String _link,boolean _box) {
  6.                 name =_name;
  7.                 link = _link;
  8.                 box = _box;
  9.         }
  10.         public  String getName() {
  11.                 return name;
  12.         }
  13.         public String getLink() {
  14.                 return link;
  15.         }
  16.         public boolean getBox() {
  17.                 return box;
  18.         }
  19.         public void setBox(boolean bx)
  20.         {
  21.                 box = bx;
  22.         }
  23.         public int describeContents() {
  24.                 // TODO Auto-generated method stub
  25.                 return 0;
  26.         }
  27.         public void writeToParcel(Parcel dest, int flags) {
  28.                 // TODO Auto-generated method stub
  29.                
  30.         }
  31.  
  32. }
  33.  

Передаю вот так:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.         Intent intentMusic = new Intent(this,MusicPlayer.class);
  2.         intentMusic.putParcelableArrayListExtra("list",musics);
  3.         startActivity(intentMusic);
  4.  

Принимаю:
Код: [ Загрузить ] [ Скрыть ]
Using Java Syntax Highlighting
  1.         Intent intent = getIntent();
  2.         musics = intent.getParcelableArrayListExtra("list");
  3.  

Проследил в логах, что на этом месте:
musics = intent.getParcelableArrayListExtra("list");
Приложение вылетает. Что я не так делаю?


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 фев 2013, 17:00 
Аватар пользователя

Зарегистрирован: 04 фев 2013, 16:51
Сообщений: 7
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Подскажите пожалуйста, можно ли этим методом передать BluetoothSocket?

при попытке записать в парсел сокет, приложение валится с ошибкой

protected BluetoothSocket fSocket;
......
// упаковываем объект в Parcel
public void writeToParcel(Parcel parcel, int flags) {
Log.d(LOG_TAG, "writeToParcel");
parcel.writeValue(fSocket);
}

java.lang.RuntimeException: Parcel: unable to marshal value android.bluetooth.BluetoothSocket@41246d38

Эти товарищи пишут, что всё плохо (
http://stackoverflow.com/questions/7894 ... ther-using


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: 04 фев 2013, 19:26 
Аватар пользователя

Зарегистрирован: 26 июн 2012, 13:22
Сообщений: 3422
Откуда: UA
Благодарил (а): 11 раз.
Поблагодарили: 244 раз.
потому что BluetoothSocket не парселейбл

_________________
R.id.team
Политика на форуме запрещена


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 52 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
cron
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB