Hello Android Developers,
Why do I get java.lang.ClassCastException when I tried to cast back
an array of custom object that implements Parcelable?
Here is the custom class:
public class Placemark implements Parcelable {
public Double latitude;
public Double longitude;
public Double distanceFromUser;
public int accuracy;
public String address;
private static final int earthRadius = 6371;
public static final Parcelable.Creator<Placemark> CREATOR = new
Parcelable.Creator<Placemark>() {
public Placemark createFromParcel(Parcel in) {
return new Placemark(in);
}
public Placemark[] newArray(int size) {
return new Placemark[size];
}
};
public Placemark(JSONObject jo) throws JSONException {
this.address = jo.getString("address");
JSONArray array = jo.getJSONObject("Point").getJSONArray(
"coordinates");
this.latitude = array.getDouble(1);
this.longitude = array.getDouble(0);
this.accuracy = array.getInt(2);
}
public Placemark(JSONObject jo, Location userLocation)
throws JSONException {
this.address = jo.getString("address");
JSONArray array = jo.getJSONObject("Point").getJSONArray(
"coordinates");
this.latitude = array.getDouble(1);
this.longitude = array.getDouble(0);
this.accuracy = array.getInt(2);
// based on Haversine formula
// (http://www.movable-type.co.uk/scripts/latlong.html)
Double dLat = Math.toRadians(userLocation.getLatitude()
- this.latitude);
Double dLon = Math.toRadians(userLocation.getLongitude()
- this.longitude);
Double a = Math.sin(dLat / 2) * Math.sin(dLat / 2)
+ Math.cos(Math.toRadians(this.latitude))
*
Math.cos(Math.toRadians(userLocation.getLatitude()))
* Math.sin(dLon / 2) * Math.sin(dLon / 2);
Double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
this.distanceFromUser = earthRadius * c;
}
public Placemark(Parcel in) {
readFromParcel(in);
}
@Override
public String toString() {
return this.address
+ (this.distanceFromUser != null ? " ("
+
Math.rint(this.distanceFromUser) + " km)" : "");
}
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
public void writeToParcel(Parcel dest, int flags) {
dest.writeDouble(latitude);
dest.writeDouble(longitude);
dest.writeInt(accuracy);
dest.writeString(address);
}
public void readFromParcel(Parcel in) {
latitude = in.readDouble();
longitude = in.readDouble();
accuracy = in.readInt();
address = in.readString();
}
}
------------------------------------------------------------------------------
and here's the code that throws the error:
Bundle lastSearchBundle = extras.getBundle("lastSearch");
mSearchResult= (Placemark[]) lastSearchBundle.getParcelableArray
("searchResult"); //-->this is the line that throws the error
------------------------------------------------------------------------------
and here's the error detail:
E/AndroidRuntime( 9449): java.lang.RuntimeException: Unable to start
activity ComponentInfo{com.xxx/com.xxx.Search}:
java.lang.ClassCastException: [Landroid.os.Parcelable;
E/AndroidRuntime( 9449): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
2268)
E/AndroidRuntime( 9449): at
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:
2284)
E/AndroidRuntime( 9449): at android.app.ActivityThread.access$1800
(ActivityThread.java:112)
E/AndroidRuntime( 9449): at android.app.ActivityThread$H.handleMessage
(ActivityThread.java:1692)
E/AndroidRuntime( 9449): at android.os.Handler.dispatchMessage
(Handler.java:99)
E/AndroidRuntime( 9449): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 9449): at android.app.ActivityThread.main
(ActivityThread.java:3948)
E/AndroidRuntime( 9449): at java.lang.reflect.Method.invokeNative
(Native Method)
E/AndroidRuntime( 9449): at java.lang.reflect.Method.invoke
(Method.java:521)
E/AndroidRuntime( 9449): at com.android.internal.os.ZygoteInit
$MethodAndArgsCaller.run(ZygoteInit.java:782)
E/AndroidRuntime( 9449): at com.android.internal.os.ZygoteInit.main
(ZygoteInit.java:540)
E/AndroidRuntime( 9449): at dalvik.system.NativeStart.main(Native
Method)
E/AndroidRuntime( 9449): Caused by: java.lang.ClassCastException:
[Landroid.os.Parcelable;
E/AndroidRuntime( 9449): at com.xxx.Search.onCreate(Search.java:96)
E/AndroidRuntime( 9449): at
android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:
1127)
E/AndroidRuntime( 9449): at
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:
2231)
E/AndroidRuntime( 9449): ... 11 more
---------------------------------------------------------------------
Can somebody point my mistake? Thank you.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---