Trying to retrieve data from parcel - android

I have an Order Object that contains an ArrayList of MenuItem Objects. Both classes implement the Parcelable interface.
When I attempt to retrieve the object from the Intent in the new activity I get the following error:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.waitron5/com.example.waitron5.SectionsActivity}: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: com.example.waitron5.MenuItem
Here is the code where I send the Order object:
i = new Intent(v.getContext(), SectionsActivity.class);
i.putExtra("data", order);
startActivity(i);
Here is the doe where I retrieve the Order object:
Intent i = getIntent();
if(i != null && i.hasExtra("data"))
{
order = i.getParcelableExtra("data");
Toast.makeText(
this.getApplicationContext(),
"recieved order object, covers: " +
order.getCovers() +
" table no: " +
order.getTable() +
" order size: " +
order.getItems().size(),
Toast.LENGTH_SHORT).show();
Order class:
package com.example.waitron5;
import java.util.ArrayList;
import android.os.Parcel;
import android.os.Parcelable;
public class Order implements Parcelable {
private int covers;
private int table;
private ArrayList<MenuItem> items;
public Order(){
super();
this.items = new ArrayList<MenuItem>();
}
public static final Parcelable.Creator<Order> CREATOR =
new Parcelable.Creator<Order>() {
#Override
public Order createFromParcel(Parcel source) {
return new Order(source);
}
#Override
public Order[] newArray(int size) {
return new Order[size];
}
};
public Order(int covers, int table) {
super();
this.covers = covers;
this.table = table;
this.items = new ArrayList<MenuItem>();
}
public int getCovers() {
return covers;
}
public void setCovers(int covers) {
this.covers = covers;
}
public int getTable() {
return table;
}
public void setTable(int table) {
this.table = table;
}
public ArrayList<MenuItem> getItems() {
return items;
}
public void setItems(ArrayList<MenuItem> items) {
this.items = items;
}
//add to order
public void addToOrder(MenuItem m){
items.add(m);
}
//remove from order
public void removeFromOrder(MenuItem m){
items.remove(m);
}
public Order(Parcel source) {
this();
readFromParcel(source);
}
#Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
// TODO Auto-generated method stub
dest.writeInt(covers);
dest.writeInt(table);
dest.writeList(items);
}
#SuppressWarnings("unchecked")
private void readFromParcel(Parcel source) {
// TODO Auto-generated method stub
covers = source.readInt();
table = source.readInt();
source.readList(items, null);
}
}
MenuItem class:
package com.example.waitron5;
import android.os.Parcel;
import android.os.Parcelable;
public class MenuItem implements Parcelable {
private String name;
private double price;
private int qty;
private String info;
public MenuItem(String name, double price) {
super();
this.name = name;
this.price = price;
}
public MenuItem() {
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
#Override
public String toString() {
return name;
}
//Parcelable methods.
public static final Parcelable.Creator<MenuItem> CREATOR =
new Parcelable.Creator<MenuItem>() {
#Override
public MenuItem createFromParcel(Parcel source) {
return new MenuItem(source);
}
#Override
public MenuItem[] newArray(int size) {
return new MenuItem[size];
}
};
public MenuItem(Parcel source) {
this();
readFromParcel(source);
}
private void readFromParcel(Parcel source) {
name = source.readString();
price = source.readDouble();
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeDouble(price);
}
}
Any ideas as to what may be happening?

I fixed my problem. The issue was as follows:
In the Order class.
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(covers);
dest.writeInt(table);
dest.writeList(items);
}
should be:
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(covers);
dest.writeInt(table);
dest.writeTypedList(items);
}
and
private void readFromParcel(Parcel source) {
covers = source.readInt();
table = source.readInt();
source.readList(items, null);
}
should be:
private void readFromParcel(Parcel source) {
covers = source.readInt();
table = source.readInt();
items = new ArrayList<MenuItem>();
source.readTypedList(items, MenuItem.CREATOR);
}

Related

Pass ArrayList of Parcelable objects throws error

I have an object with a couple of Strings, one int and another object which has 4 inner objects. All of them implementing Parcelable. In order to generate the boilerplate code, I used Parcelable plugin from Android studio.
Even though all the objects are parcelable, I'm getting the following error: android.os.BadParcelableException: ClassNotFoundException when unmarshalling: AlbumTrackResponse
Here's how the POJOs look like:
Main object:
public class AlbumTrackResponse implements Parcelable {
private String id;
private String albumId;
private String position;
private String title;
private int rate;
private AllServices services;
public AllServices getServices() {
return services;
}
public void setServices(AllServices services) {
this.services = services;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAlbumId() {
return albumId;
}
public void setAlbumId(String albumId) {
this.albumId = albumId;
}
public String getPosition() {
return position;
}
public void setPosition(String position) {
this.position = position;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getRate() {
return rate;
}
public void setRate(int rate) {
this.rate = rate;
}
protected AlbumTrackResponse(Parcel in) {
id = in.readString();
albumId = in.readString();
position = in.readString();
title = in.readString();
rate = in.readInt();
services = (AllServices) in.readValue(AllServices.class.getClassLoader());
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(id);
dest.writeString(albumId);
dest.writeString(position);
dest.writeString(title);
dest.writeInt(rate);
dest.writeValue(services);
}
#SuppressWarnings("unused")
public static final Parcelable.Creator<AlbumTrackResponse> CREATOR = new Parcelable.Creator<AlbumTrackResponse>() {
#Override
public AlbumTrackResponse createFromParcel(Parcel in) {
return new AlbumTrackResponse(in);
}
#Override
public AlbumTrackResponse[] newArray(int size) {
return new AlbumTrackResponse[size];
}
};
}
Inner object with 4 objects
public class AllServices implements Parcelable {
private GigRevService gigrev;
private AppleService apple;
private GoogleService google;
private SpotifyService spotify;
protected AllServices(Parcel in) {
gigrev = (GigRevService) in.readValue(GigRevService.class.getClassLoader());
apple = (AppleService) in.readValue(AppleService.class.getClassLoader());
google = (GoogleService) in.readValue(GoogleService.class.getClassLoader());
spotify = (SpotifyService) in.readValue(SpotifyService.class.getClassLoader());
}
#Override
public int describeContents() {
return 0;
}
public GigRevService getGigrev() {
return gigrev;
}
public void setGigrev(GigRevService gigrev) {
this.gigrev = gigrev;
}
public AppleService getApple() {
return apple;
}
public void setApple(AppleService apple) {
this.apple = apple;
}
public GoogleService getGoogle() {
return google;
}
public void setGoogle(GoogleService google) {
this.google = google;
}
public SpotifyService getSpotify() {
return spotify;
}
public void setSpotify(SpotifyService spotify) {
this.spotify = spotify;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeValue(gigrev);
dest.writeValue(apple);
dest.writeValue(google);
dest.writeValue(spotify);
}
#SuppressWarnings("unused")
public static final Parcelable.Creator<AllServices> CREATOR = new Parcelable.Creator<AllServices>() {
#Override
public AllServices createFromParcel(Parcel in) {
return new AllServices(in);
}
#Override
public AllServices[] newArray(int size) {
return new AllServices[size];
}
};
}
The inner objects from here contain just string items.
Here's how I pass the ArrayList to the bundle:
bundle.putParcelableArrayList(MediaPlayerService.TRACK_LIST, trackList);
I'm passing the items from an Activity to a Service. Any ideas why I'm getting this error?
EDIT: Implementation of service classes
public class GoogleService implements Parcelable {
private String name;
private String uri;
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
protected GoogleService(Parcel in) {
name = in.readString();
uri = in.readString();
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(uri);
}
#SuppressWarnings("unused")
public static final Parcelable.Creator<GoogleService> CREATOR = new Parcelable.Creator<GoogleService>() {
#Override
public GoogleService createFromParcel(Parcel in) {
return new GoogleService(in);
}
#Override
public GoogleService[] newArray(int size) {
return new GoogleService[size];
}
};
}
This looks extremly strange
this.services = in.readParcelable(getClass().getClassLoader());
You are pointing out to the wrong class loader. You have to use it like this
this.services = (AllServices)in.readParcelable(AllServices.class.getClassLoader());
Besides that, I am always using this site http://www.parcelabler.com/ to quickly generate my Parceables. Or you could use it like this
services = (AllServices) in.readValue(AllServices.class.getClassLoader());
Here:
protected AllServices(Parcel in) { this.gigrev = in.readParcelable(getClass().getClassLoader());
this.apple = in.readParcelable(getClass().getClassLoader());
this.google = in.readParcelable(getClass().getClassLoader());
this.spotify = in.readParcelable(getClass().getClassLoader()); }
Replace it with
protected AllServices(Parcel in) { this.gigrev = in.readParcelable(GigRevService.class.getClassLoader());
this.apple = in.readParcelable(AppleService.class.getClassLoader());
this.google = in.readParcelable(GoogleService.class.getClassLoader());
this.spotify = in.readParcelable(SpotifyService.class.getClassLoader()); }
And replace:
this.services = in.readParcelable(getClass().getClassLoader());
With:
this.services = in.readParcelable(AllServices.class.getClassLoader());
Also can you show the GoogleService etc classes? Each inner object's class must have a Parcelable creator also and implement the Parcelable interface as well.

Put two parcelable inside same intent

Folks, I'm getting mad with parcelables.
Here goes, I have these lines:
Intent i = new Intent(context, PaymentDetailsActivity.class);
i.putExtra(ConstantsUtils.PARAM_INTENT_ORDER_DETAILS, responseOrderInfoApiModel);
i.putExtra(ConstantsUtils.PARAM_INTENT_PAYMENT_INFO, paymentInfoViewModel);
startActivity(i);
and here I receive my parcelables:
Intent receivedIntent = getIntent();
responseOrderInfoApiModel = receivedIntent.getParcelableExtra(ConstantsUtils.PARAM_INTENT_ORDER_DETAILS);
paymentInfoViewModel = receivedIntent.getParcelableExtra(ConstantsUtils.PARAM_INTENT_PAYMENT_INFO);
The point is, responseOrderInfoApiModel is receiving a null, but it shouldn't, however if I comment the line:
i.putExtra(ConstantsUtils.PARAM_INTENT_PAYMENT_INFO, paymentInfoViewModel);
My responseOrderInfoApiModel receive the correct value.
Here goes my parcelables:
ResponseOrderInfoApiModel -
public class ResponseOrderInfoApiModel implements Parcelable{
private String cardNumber;
private double total;
private ArrayList<ResponseOrderItemApiModel> listItem;
public ResponseOrderInfoApiModel() {
}
public ResponseOrderInfoApiModel(Parcel source) {
if(listItem == null){
listItem = new ArrayList<>();
}
setCardNumber(source.readString());
setTotal(source.readDouble());
source.readTypedList(listItem, ResponseOrderItemApiModel.CREATOR);
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(cardNumber);
dest.writeDouble(total);
dest.writeTypedList(listItem);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
#Override
public ResponseOrderInfoApiModel createFromParcel(Parcel source) {
return new ResponseOrderInfoApiModel(source);
}
#Override
public ResponseOrderInfoApiModel[] newArray(int size) {
return new ResponseOrderInfoApiModel[size];
}
};
#Override
public int describeContents() {
return 0;
}
public ArrayList<ResponseOrderItemApiModel> getListItem() {
return listItem;
}
public void setListItem(ArrayList<ResponseOrderItemApiModel> listItem) {
this.listItem = listItem;
}
public String getCardNumber() {
return cardNumber;
}
public void setCardNumber(String cardNumber) {
this.cardNumber = cardNumber;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
}
ResponseOrderItemApiModel (is a arrayList in ResponseOrderInfoApiModel) -
public class ResponseOrderItemApiModel implements Parcelable {
private String description;
private int quantity;
private double total;
private double unitPrice;
public ResponseOrderItemApiModel() {
}
public ResponseOrderItemApiModel(Parcel source) {
setDescription(source.readString());
setQuantity(source.readInt());
setTotal(source.readDouble());
setUnitPrice(source.readDouble());
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(description);
dest.writeInt(quantity);
dest.writeDouble(total);
dest.writeDouble(unitPrice);
}
public static Parcelable.Creator<ResponseOrderItemApiModel> CREATOR = new Parcelable.Creator<ResponseOrderItemApiModel>(){
#Override
public ResponseOrderItemApiModel createFromParcel(Parcel source) {
return new ResponseOrderItemApiModel(source);
}
#Override
public ResponseOrderItemApiModel[] newArray(int size) {
return new ResponseOrderItemApiModel[size];
}
};
#Override
public int describeContents() {
return 0;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public double getTotal() {
return total;
}
public void setTotal(double total) {
this.total = total;
}
public double getUnitPrice() {
return unitPrice;
}
public void setUnitPrice(double unitPrice) {
this.unitPrice = unitPrice;
}
}
PaymentInfoViewModel -
public class PaymentInfoViewModel implements Parcelable {
private long idEstablishment;
private String nameEstablishment;
private int cardNumber;
private double cardSubTotalValue;
private double cardTotalValue;
private byte tipPercentage;
private long idCardPayment;
public PaymentInfoViewModel() {
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
#Override
public PaymentInfoViewModel createFromParcel(Parcel source) {
return new PaymentInfoViewModel(source);
}
#Override
public PaymentInfoViewModel[] newArray(int size) {
return new PaymentInfoViewModel[size];
}
};
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(idEstablishment);
dest.writeString(nameEstablishment);
dest.writeInt(cardNumber);
dest.writeDouble(cardSubTotalValue);
dest.writeDouble(cardTotalValue);
dest.writeByte(tipPercentage);
dest.writeLong(idCardPayment);
}
public PaymentInfoViewModel(Parcel source) {
setIdEstablishment(source.readLong());
setNameEstablishment(source.readString());
setCardNumber(source.readInt());
setCardSubTotalValue(source.readDouble());
setCardTotalValue(source.readDouble());
setTipPercentage(source.readByte());
setIdCardPayment(idCardPayment);
}
public long getIdEstablishment() {
return idEstablishment;
}
public void setIdEstablishment(long idEstablishment) {
this.idEstablishment = idEstablishment;
}
public String getNameEstablishment() {
return nameEstablishment;
}
public void setNameEstablishment(String nameEstablishment) {
this.nameEstablishment = nameEstablishment;
}
public int getCardNumber() {
return cardNumber;
}
public void setCardNumber(int cardNumber) {
this.cardNumber = cardNumber;
}
public double getCardTotalValue() {
return cardTotalValue;
}
public void setCardTotalValue(double cardTotalValue) {
this.cardTotalValue = cardTotalValue;
}
public byte getTipPercentage() {
return tipPercentage;
}
public void setTipPercentage(byte tipPercentage) {
this.tipPercentage = tipPercentage;
}
public double getCardSubTotalValue() {
return cardSubTotalValue;
}
public void setCardSubTotalValue(double cardSubTotalValue) {
this.cardSubTotalValue = cardSubTotalValue;
}
public long getIdCardPayment() {
return idCardPayment;
}
public void setIdCardPayment(long idCardPayment) {
this.idCardPayment = idCardPayment;
}
}
Try using bundle and put your data in bundle and then put bundle in to intent. Once i had such a funny problem and this method solved my problem.

Android Parceable issue

I am currently trying to pass a parceablearraylist from mylogin activity to my main activity but getting a
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.muuves.introround/com.muuves.introround.activities.MainActivity}: java.lang.RuntimeException: Parcel android.os.Parcel#41ef90a8: Unmarshalling unknown type code 7536741 at offset 684
Here are my parceable objects
public class Challenge implements Parcelable {
private Integer id;
private Integer challenger_id;
private Integer friend_id;
private String artist_name;
private String song_name;
private String image_url;
private String song_url;
private String answer_url;
private int challenge_attempts_left;
private int answer;
private Person person;
private Person friend;
public Challenge() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getChallenger_id() {
return challenger_id;
}
public void setChallenger_id(Integer challenger_id) {
this.challenger_id = challenger_id;
}
public Integer getFriend_id() {
return friend_id;
}
public void setFriend_id(Integer friend_id) {
this.friend_id = friend_id;
}
public String getArtist_name() {
return artist_name;
}
public void setArtist_name(String artist_name) {
this.artist_name = artist_name;
}
public String getSong_name() {
return song_name;
}
public void setSong_name(String song_name) {
this.song_name = song_name;
}
public String getImage_url() {
return image_url;
}
public void setImage_url(String image_url) {
this.image_url = image_url;
}
public String getSong_url() {
return song_url;
}
public void setSong_url(String song_url) {
this.song_url = song_url;
}
public String getAnswer_url() {
return answer_url;
}
public void setAnswer_url(String answer_url) {
this.answer_url = answer_url;
}
public int getChallenge_attempts_left() {
return challenge_attempts_left;
}
public void setChallenge_attempts_left(int challenge_attempts_left) {
this.challenge_attempts_left = challenge_attempts_left;
}
public int getAnswer() {
return answer;
}
public void setAnswer(int answer) {
this.answer = answer;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public Person getFriend() {
return friend;
}
public void setFriend(Person friend) {
this.friend = friend;
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(challenger_id);
dest.writeInt(friend_id);
dest.writeString(artist_name);
dest.writeString(image_url);
dest.writeString(song_url);
dest.writeString(answer_url);
dest.writeInt(challenge_attempts_left);
dest.writeInt(answer);
dest.writeParcelable(person, flags);
dest.writeParcelable(friend, flags);
}
public static final Parcelable.Creator<Challenge> CREATOR = new Parcelable.Creator<Challenge>() {
#Override
public Challenge createFromParcel(Parcel in) {
Challenge challenge = new Challenge();
challenge.setId(in.readInt());
challenge.setChallenger_id(in.readInt());
challenge.setFriend_id(in.readInt());
challenge.setArtist_name(in.readString());
challenge.setSong_name(in.readString());
challenge.setImage_url(in.readString());
challenge.setSong_url(in.readString());
challenge.setAnswer_url(in.readString());
challenge.setChallenge_attempts_left(in.readInt());
challenge.setAnswer(in.readInt());
challenge.setPerson((Person) in.readParcelable(Person.class.getClassLoader()));
challenge.setFriend((Person) in.readParcelable(Person.class.getClassLoader()));
return challenge;
}
#Override
public Challenge[] newArray(int size) {
return new Challenge[size];
}
};
}
public class Person implements Parcelable {
private int id;
private String first_name;
private String last_name;
private String image_url;
public Person(){
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getFirst_Name() {
return first_name;
}
public void setFirst_Name(String first_name) {
this.first_name = first_name;
}
public String getLast_Name() {
return last_name;
}
public void setLast_Name(String last_name) {
this.last_name = last_name;
}
public String getImage_url() {
return image_url;
}
public void setImage_url(String image_url) {
this.image_url = image_url;
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(first_name);
dest.writeString(last_name);
dest.writeString(image_url);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
#Override
public Person createFromParcel(Parcel in) {
Person person = new Person();
person.setId(in.readInt());
person.setFirst_Name(in.readString());
person.setLast_Name(in.readString());
person.setImage_url(in.readString());
return person;
}
#Override
public Person[] newArray(int size) {
return null;
}
};
}
Login activity
#Override
public void preLoadDetails(Details details) {
Intent intent = new Intent(this, MainActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("receive", details.getReceive());
intent.putExtras(bundle);
startActivity(intent);
}
MainActivity
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getIntent().getExtras();
ArrayList<Challenge> friends = bundle.getParcelableArrayList("receive");
mContent = new MainFragment(0);
mContent.setArguments(getIntent().getExtras());
// set the Above View
setContentView(R.layout.home_frame);
getSupportFragmentManager().beginTransaction()
.replace(R.id.content_frame, mContent).commit();
// set the Behind View
setBehindContentView(R.layout.menu_frame);
getSupportFragmentManager().beginTransaction()
.replace(R.id.menu_frame, new MenuFragment()).commit();
// Disable
getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_NONE);
}
Been trying to fix it for the pass day and getting no where all I know is that person parceable object in the challenge object are always null but they are not when I put them in the bundle.
Appreciate any input.
Those Integer type could be null or an int, you need to handle that situation properly.
For example I have utility functions like this :
static public Integer readInteger(Parcel in){
if(in.readInt() == 1){
return in.readInt();
}else{
return null;
}
}
static public void writeInteger(Integer value, Parcel out){
if(value != null){
out.writeInt(1);
out.writeInt(value);
}else{
out.writeInt(0);
}
}
First thing in the class Challenge you use Integer attributes and you parce "int" those are 2 diferents things.
Exemple of how i do things myself :
public Podcast(Parcel parcel) {
id = parcel.readLong();
title = parcel.readString();
subtitle = parcel.readString();
summary = parcel.readString();
duration = parcel.readString();
author = parcel.readString();
date = parcel.readString();
mp3 = parcel.readString();
podcastCategoryId = parcel.readLong();
}
#Override
public int describeContents() {
// not used
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(id);
dest.writeString(title);
dest.writeString(subtitle);
dest.writeString(summary);
dest.writeString(duration);
dest.writeString(author);
dest.writeString(date);
dest.writeString(mp3);
dest.writeLong(podcastCategoryId);
}
public static Creator<Podcast> CREATOR = new Creator<Podcast>() {
public Podcast createFromParcel(Parcel parcel) {
return new Podcast(parcel);
}
public Podcast[] newArray(int size) {
return new Podcast[size];
}
};
#Override
public Person[] newArray(int size) {
return null;
}
You should create there an array of that size and return it.
#Override
public Person[] newArray(int size) {
return new Person[size];
}
Solved it was actually very simple, forgot song url when i was writing to the parcel. Any when i missed that write that was why i was getting the weird exception for person object. it was expecting a person object but was getting something else. 1 day wasted oh well :(
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(challenger_id);
dest.writeInt(friend_id);
dest.writeString(artist_name);
**dest.writeString(song_name);**
dest.writeString(image_url);
dest.writeString(song_url);
dest.writeString(answer_url);
dest.writeInt(challenge_attempts_left);
dest.writeInt(answer);
dest.writeParcelable(person, flags);
dest.writeParcelable(friend, flags);
}

Implementing parcelable in a class to pass it from an activity to another

i have class student
i tried to use seriablizable but couldnt make it work... this didnt work too can any one find whats wrong with it?
that uses class semester and Course in its variables take a look
public class Student implements Parcelable {
private double GPA, MGPA;
private LinkedList<Course> finishedcourses;
private String username, password;
private Semester semester;
public Student(String user, String pass, double gpa, double mgpa,
LinkedList<Course> fc, Semester s) {
username = user;
password = pass;
GPA = gpa;
MGPA = mgpa;
semester = s;
finishedcourses = fc;
}
#Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
#Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(username);
out.writeString(password);
out.writeDouble(GPA);
out.writeDouble(MGPA);
out.writeParcelable((Parcelable) finishedcourses , flags);
out.writeParcelable((Parcelable) semester, flags);
}
public static final Creator<Student> CREATOR = new Parcelable.Creator<Student> (){
public Student createFromParcel(Parcel in) {
return new Student(in);
}
public Student[] newArray(int size) {
return new Student[size];
}
};
public Student(Parcel in)
{
username = in.readString();
password = in.readString();
GPA = in.readDouble();
MGPA = in.readDouble();
finishedcourses = in.readParcelable(Course.class.getClassLoader());
semester = in.readParcelable(Semester.class.getClassLoader());
}}
this is class Semester:
public class Semester implements Parcelable{
private LinkedList<Course> current;
private int Credits;
public Semester(LinkedList<Course> current) {
super();
this.current = current;
Credits = calcCredits();
}
#Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
#Override
public void writeToParcel(Parcel out, int flags) {
out.writeInt(Credits);
out.writeParcelable((Parcelable) current, flags);
}
public Semester(Parcel in) {
Credits = in.readInt();
current = in.readParcelable(Course.class.getClassLoader());
}
public static final Creator<Semester> CREATOR = new Parcelable.Creator<Semester>() {
public Semester createFromParcel(Parcel in)
{
return new Semester(in);
}
#Override
public Semester[] newArray(int size) {
// TODO Auto-generated method stub
return new Semester[size];
}
};}
This is class course
public class Course implements Parcelable{
private int credits;
private String LetterGrade,Name;
public Course(int credits, String Name, String Letter) {
this.Name = Name;
LetterGrade = Letter;
this.credits = credits;
}
#Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
#Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(Name);
out.writeString(LetterGrade);
out.writeInt(credits);
}
public static final Creator<Course> CREATOR = new Parcelable.Creator<Course>() {
#Override
public Course createFromParcel(Parcel in) {
return new Course(in);
}
#Override
public Course[] newArray(int size) {
return new Course[size];
}
};
public Course (Parcel in){
Name = in.readString();
LetterGrade = in.readString();
credits = in.readInt();
}}
try this in Student class:
//initialize the list
private LinkedList<Course> finishedcourses = new LinkedList<Course>();
#Override
public void writeToParcel(Parcel out, int flags) {
out.writeString(username);
out.writeString(password);
out.writeDouble(GPA);
out.writeDouble(MGPA);
//replace by writeTypedList
out.writeTypedList(finishedcourses);
out.writeParcelable(semester, flags);
}
public Student(Parcel in)
{
username = in.readString();
password = in.readString();
GPA = in.readDouble();
MGPA = in.readDouble();
//replace by readTypedList
in.readTypedList(finishedcourses, Course.CREATOR);
semester = in.readParcelable(Semester.class.getClassLoader());
}
Do the same for the list private LinkedList current; in class Semester.

How to transfer object from one activity to another using parcelable?

I am transferring an object from one activity to another using parcelable, but it showing null
as retrieving that object in another activity.
any suggestions?
Here's the code :
public class TPackage implements Parcelable {
// private static final long serialVersionUID = 1L;
private int cost;
private String name;
private int totalChannels;
private HashMap<String, Channel> channelList;
public int getCost() {
return cost;
}
public void setCost(int cost) {
this.cost = cost;
}
public int getTotal_channels() {
return totalChannels;
}
public void setTotal_channels(int total_channels) {
this.totalChannels = total_channels;
}
public HashMap<String, Channel> getList() {
return channelList;
}
public void setList(HashMap<String, Channel> list) {
this.channelList = list;
}
public void put(String name, Channel c) {
channelList.put(name, c);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
}
public static final Parcelable.Creator<TPackage> CREATOR = new Parcelable.Creator<TPackage>() {
public TPackage createFromParcel(Parcel in) {
return new TPackage();
}
public TPackage[] newArray(int size) {
return new TPackage[size];
}
};
}
This is the right way to transfer your object using parcel andorid
public class TPackage implements Parcelable {
// private static final long serialVersionUID = 1L;
private int cost;
private String name;
private int totalChannels;
private HashMap<String, Channel> channelList;
public TPackage(int cost, String name, int totalChannels,
HashMap<String, Channel> channelList){
this.cost = cost;
this.name = name;
this.totalChannels = totalChannels;
this.channelList = channelList;
}
public TPackage(Parcel in){
//same order as that in writeToParcel()
cost = in.readInt();
name = in.readString();
totalChannels = in.readInt();
Bundle bundle = in.readBundle();
channelList = (HashMap<String, Channel>) bundle.getSerializable("channelList");
}
public int getCost() {
return cost;
}
public void setCost(int cost) {
this.cost = cost;
}
public int getTotal_channels() {
return totalChannels;
}
public void setTotal_channels(int total_channels) {
this.totalChannels = total_channels;
}
public HashMap<String, Channel> getList() {
return channelList;
}
public void setList(HashMap<String, Channel> list) {
this.channelList = list;
}
public void put(String name, Channel c) {
channelList.put(name, c);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(cost);
dest.writeString(name);
dest.writeInt(totalChannels);
//easiest way to transfer HashMap via parcel
Bundle bundle = new Bundle();
bundle.putSerializable("channelList", channelList);
dest.writeBundle(bundle);
}
public static final Parcelable.Creator<TPackage> CREATOR = new Parcelable.Creator<TPackage>() {
public TPackage createFromParcel(Parcel in) {
return new TPackage(in);
}
public TPackage[] newArray(int size) {
return new TPackage[size];
}
};
}
[EDITED]
This is the sender activity
public class MyActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TPackage tPackage = new TPackage(10, "hello", 123, new HashMap<String, Channel>());
Intent intent = new Intent(this, NActivity.class);
intent.putExtra("parcel", tPackage);
startActivity(intent);
}
}
This is the receiver activity
public class NActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = getIntent();
TPackage tPackage = intent.getParcelableExtra("parcel");
HashMap<String, Channel> hashMap = tPackage.getList();
Log.d("MyTag", "cost : " + tPackage.getCost() + " name: " + tPackage.getName()
+ " total channels: " + tPackage.getTotal_channels() + " list count: " + hashMap.size());
}
}
Logcat output
09-13 21:57:20.578: DEBUG/MyTag(1478): cost : 10 name: hello total channels: 123 list count: 0
You may need to actually put something in the createFromParcel and in writeToParcel (like the content of the object)

Categories

Resources