2011-10-13 43 views
0

我遇到了android parcelable问题。Android parcelable error

我得到这个异常:

01-04 03:21:00.318: ERROR/AndroidRuntime(18973): FATAL EXCEPTION: main 
    java.lang.RuntimeException: Parcel [email protected]: 
     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) 

我有以下类别:

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; 
    } 
} 

我火的意图从活动:

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) ; 

并且接受它在另一个活动:

@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>() ; 
} 

是什么原因导致这种异常?

+0

http://stackoverflow.com/questions/6681217/help-passing-an-arraylist-of-objects-to-a-new-activity ..我不知道它是否对你有帮助,但在问一个问题之前保持谷歌,因为你会发现很多类似的问题。谢谢 – RobinHood

+0

我想你有解析ArrayList中的问题检查此问题http://stackoverflow.com/questions/7400564/android-parcelable-retailerorderactivity-java-return-null/7400675#7400675 –

回答

1

您的代码最终根据需要调用readString和readFloat两次。一旦你读取了createFromParcel方法中的数据,然后再在构造函数中读取数据。你可以消除其中的一个。