0

我在使用 android parcelable 时遇到问题。

我得到这个例外:

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)

我有以下课程:

城市.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>() ;
}

是什么导致了这个异常?

4

1 回答 1

1

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

于 2011-10-13T04:58:16.740 回答