0

I'm having a problem with the android parcelable.

I am getting this Exception:

01-04 03:21:00.318: ERROR/AndroidRuntime(18973): FATAL EXCEPTION: main
  java.lang.RuntimeException: Parcel android.os.Parcel@48302ba8: 
      Unmarshalling unknown type code 6881383 at offset 244

  at android.os.Parcel.readValue(Parcel.java:1851)
  at android.os.Parcel.readListInternal(Parcel.java:2030)
  at android.os.Parcel.readArrayList(Parcel.java:1474)
  at android.os.Parcel.readValue(Parcel.java:1805)
  at android.os.Parcel.readMapInternal(Parcel.java:2021)
  at android.os.Bundle.unparcel(Bundle.java:208)
  at android.os.Bundle.getParcelableArrayList(Bundle.java:1144)

I have the following classes :

Cities.java

package project.login;

import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.overlay.OverlayItem;

import android.os.Parcel;
import android.os.Parcelable;

public class Cities extends OverlayItem implements Parcelable{
    private String cityName ;
    private String cityTime;
    private String countryName;
    private String day;
    private String timeZone;
    private float latitude ;
    private float longitude ;


    public Cities(String cityName, String cityTime, String countryName, String day, String timeZone, float latitude, float longitude) {
        super(cityName, countryName, new GeoPoint(latitude, longitude));
        this.cityName = cityName;
        this.cityTime = cityTime;
        this.countryName = countryName;
        this.day = day;
        this.timeZone = timeZone;
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public Cities(String cityName, String cityTime, String countryName, String day, String timeZone, float latitude, float longitude, Parcel parcel) {
        super(cityName, countryName, new GeoPoint(latitude, longitude));

        this.cityName = parcel.readString();
        this.cityTime = parcel.readString();
        this.countryName = parcel.readString();
        this.day = parcel.readString();
        this.timeZone = parcel.readString();
        this.latitude = parcel.readFloat() ;
        this.longitude = parcel.readFloat() ;
    }

    @Override
    public int describeContents() {
        return this.hashCode() ;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(cityName) ;
        dest.writeString(cityTime) ;
        dest.writeString(countryName) ;
        dest.writeString(day) ;
        dest.writeString(timeZone) ;
        dest.writeFloat(latitude) ;
        dest.writeFloat(longitude) ;
    }

    public static final Parcelable.Creator<Cities> CREATOR = new Parcelable.Creator<Cities>() {
        public Cities createFromParcel(Parcel in) {
            return new Cities(in.readString(), in.readString(), in.readString(), in.readString(),  in.readString(), in.readFloat(), in.readFloat(), in);
        }

        public Cities[] newArray(int size) {
            return new Cities[size];
        }
    };  

    public String getCityName() {
        return cityName;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public String getCityTime() {
        return cityTime;
    }

    public void setCityTime(String cityTime) {
        this.cityTime = cityTime;
    }

    public String getCountryName() {
        return countryName;
    }

    public void setCountryName(String countryName) {
        this.countryName = countryName;
    }

    public String getDay() {
        return day;
    }

    public void setDay(String day) {
        this.day = day;
    }

    public String getTimeZone() {
        return timeZone;
    }

    public void setTimeZone(String timeZone) {
        this.timeZone = timeZone;
    }

    public float getLatitude() {
        return latitude;
    }

    public void setLatitude(float latitude) {
        this.latitude = latitude;
    }

    public float getLongitude() {
        return longitude;
    }

    public void setLongitude(float longitude) {
        this.longitude = longitude;
    }
}

I fire an intent from an activity :

final List<Cities> cityList = new ArrayList<Cities>();

cityList.add(new Cities(
  "TOKYO", "7:15 AM", "Japan", "Today", "UTC + 9:30", 10.2f , 11.2f)) ;

cityList.add(new Cities(
  "NEW DELHI", "4:00 PM", "India", "Today", "UTC + 5:30", 111.0f, 123.0f)) ;

cityList.add(new Cities(
  "NEW YORK", "4:00 AM", "Usa", "Today", "UTC - 5:30", 23.4f, 77.5f)) ;

Intent intent = new Intent(mContext, LoginSubActivity.class) ;
Bundle bundle = new Bundle() ;

ArrayList<Cities> listOfCities = new ArrayList<Cities>() ;
listOfCities.addAll(cityList) ;
bundle.putParcelableArrayList("cities", listOfCities) ;
intent.putExtras(bundle) ;
startActivity(intent) ;

And recieve it in another activity :

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    Bundle bundle = intent.getExtras() ;

    //THE EXCEPTION IS THROWN HERE:
    ArrayList<Cities> cityList = bundle.getParcelableArrayList("cities") ;
    final ArrayList<OverlayItem> overlayItemList = new ArrayList<OverlayItem>() ;
}

What causes this Exception?

Eric Leschinski
  • 146,994
  • 96
  • 417
  • 335
Vaibhav
  • 435
  • 1
  • 7
  • 11
  • http://stackoverflow.com/questions/6681217/help-passing-an-arraylist-of-objects-to-a-new-activity.. I don't know whether it is helpful to you or not, but keep Google before asking a question because there are lots of similar question you will find on SO. thanks – RobinHood Oct 13 '11 at 04:29
  • I guess you are having problem in parsing ArrayList check this http://stackoverflow.com/questions/7400564/android-parcelable-retailerorderactivity-java-return-null/7400675#7400675 – Lalit Poptani Oct 13 '11 at 05:04

1 Answers1

1

Your code ends up calling readString and readFloat twice as many times as needed. Once you read the data in the createFromParcel method and then again in the constructor. You can eliminate one of the two.

satur9nine
  • 13,927
  • 5
  • 80
  • 123