Thanks again Kostya. I don't understand why my List of Restaurant objects is a LinkedList, since I define it as private List<Restaurant> restaurants = new ArrayList<Restaurant>(); in my RestaurantList class...
Anyway, I tried your fix, but I'm still messed with types: -first, I had to cast restaurantList.getRestaurants().toArray() to (Restaurant[]), because it returns an Object[]: Restaurant[] restArray = (Restaurant[])restaurantList.getRestaurants().toArray(); outState.putParcelableArray("restoList",restArray); -and even with that, I get an error when executing putParcelableArray: 07-06 16:09:30.066: ERROR/AndroidRuntime(930): java.lang.RuntimeException: Unable to pause activity {org.digitalfarm.atable/org.digitalfarm.atable.Atable}: java.lang.ClassCastException: [Ljava.lang.Object; 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread.performPauseActivity(ActivityThread.java: 2840) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread.performPauseActivity(ActivityThread.java: 2797) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java: 2780) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread.access$2000(ActivityThread.java:112) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.os.Handler.dispatchMessage(Handler.java:99) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.os.Looper.loop(Looper.java:123) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread.main(ActivityThread.java:3948) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at java.lang.reflect.Method.invokeNative(Native Method) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at java.lang.reflect.Method.invoke(Method.java:521) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at com.android.internal.os.ZygoteInit $MethodAndArgsCaller.run(ZygoteInit.java:782) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at dalvik.system.NativeStart.main(Native Method) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): Caused by: java.lang.ClassCastException: [Ljava.lang.Object; 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at org.digitalfarm.atable.Atable.onSaveInstanceState(Atable.java:254) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.Activity.performSaveInstanceState(Activity.java:1008) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java: 1256) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): at android.app.ActivityThread.performPauseActivity(ActivityThread.java: 2822) 07-06 16:09:30.066: ERROR/AndroidRuntime(930): ... 12 more Julien On Jul 5, 10:17 pm, Kostya Vasilyev <kmans...@gmail.com> wrote: > Jul, > > This is the heart of the problem in logcat: > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): Caused by: > java.lang.ClassCastException: java.util.LinkedList > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > org.digitalfarm.atable.Atable.onSaveInstanceState(Atable.java:254) > > My guess is that > > gson.fromJson > > creates a LinkedList<Restaurant>, then it blows at line Atable.java:254. > > I am guessing it's the line saying: > > outState.putParcelableArrayList("restoList", > (ArrayList<Restaurant>)restaurantList.getRestaurants()); > > and the immediate cause is the cast from LinkedList<Restaurant> to > ArrayList<Restaurant>, which are unrelated classes. > > To fix this, you can change the above code to read: > > Restaurant[] restArray = restaurantList.getRestaurants().toArray(); > outState.putParcelableArray("restoList",restArray); > > -- Kostya > > 05.07.2010 21:42, jul пишет: > > > > > Is it the right way to do it? The writeToParcel method of my > > Restaurant object is never called... > > > The error seems to be in > > > outState.putParcelableArrayList("restoList", > > (ArrayList<Restaurant>)restaurantList.getRestaurants()); > > > and I get in my LogCat: > > > 07-05 19:34:13.846: WARN/ActivityManager(563): Activity pause timeout > > for HistoryRecord{436950f8 {org.digitalfarm.atable/ > > org.digitalfarm.atable.Atable}} > > 07-05 19:34:28.336: DEBUG/AndroidRuntime(808): Shutting down VM > > 07-05 19:34:28.336: WARN/dalvikvm(808): threadid=3: thread exiting > > with uncaught exception (group=0x4000fe70) > > 07-05 19:34:28.336: ERROR/AndroidRuntime(808): Uncaught handler: > > thread main exiting due to uncaught exception > > 07-05 19:34:28.637: DEBUG/dalvikvm(808): GC freed 3337 objects / > > 259288 bytes in 94ms > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): > > java.lang.RuntimeException: Unable to pause activity > > {org.digitalfarm.atable/org.digitalfarm.atable.Atable}: > > java.lang.ClassCastException: java.util.LinkedList > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread.performPauseActivity(ActivityThread.java: > > 2840) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread.performPauseActivity(ActivityThread.java: > > 2797) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread.handlePauseActivity(ActivityThread.java: > > 2780) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread.access$2000(ActivityThread.java:112) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread$H.handleMessage(ActivityThread.java:1699) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.os.Handler.dispatchMessage(Handler.java:99) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.os.Looper.loop(Looper.java:123) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread.main(ActivityThread.java:3948) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > java.lang.reflect.Method.invokeNative(Native Method) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > java.lang.reflect.Method.invoke(Method.java:521) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > com.android.internal.os.ZygoteInit > > $MethodAndArgsCaller.run(ZygoteInit.java:782) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > dalvik.system.NativeStart.main(Native Method) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): Caused by: > > java.lang.ClassCastException: java.util.LinkedList > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > org.digitalfarm.atable.Atable.onSaveInstanceState(Atable.java:254) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.Activity.performSaveInstanceState(Activity.java:1008) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.Instrumentation.callActivityOnSaveInstanceState(Instrumentation.java: > > 1256) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): at > > android.app.ActivityThread.performPauseActivity(ActivityThread.java: > > 2822) > > 07-05 19:34:28.647: ERROR/AndroidRuntime(808): ... 12 more > > > thanks for your help > > > On Jul 5, 6:31 pm, Kostya Vasilyev<kmans...@gmail.com> wrote: > > >> Jul, > > >> Parcelable implementation looks good, except for the questionable cast > >> to ArrayList<Restaurant>, but that shouldn't have any effect. > > >> What error are you getting, exactly? > > >> -- Kostya > > >> 05.07.2010 20:20, jul пишет: > > >>> Hi, > > >>> I want to save a list of Parcelable Restaurant objects on > >>> onSaveInstanceState. I created a Restaurant class extending Parcelable > >>> and a RestaurantList object, both shown below. In my main activity I > >>> fill my RestauranList directly from json internet data using GSON: > > >>> restaurantList = gson.fromJson(r, RestaurantList.class); > > >>> Now, when I want to save the List of Restaurant objects using > > >>> protected void onSaveInstanceState(Bundle outState) { > > >>> if (restaurantList != null ) { > >>> outState.putParcelableArrayList("restoList", > >>> (ArrayList<Restaurant>)restaurantList.getRestaurants()); > >>> } > > >>> super.onSaveInstanceState(outState); > >>> } > > >>> I get an error, I guess because Parcelable data are not written. How > >>> should I do it? Do I have to create an array of Parcel objects in my > >>> main activity and fill it by calling writeToParcel for each of the > >>> Restaurant objects? > > >>> thanks for any suggestion > > >>> Julien > > >>> **************************RestaurantList > >>> class************************** > > >>> public class RestaurantList { > > >>> private List<Restaurant> restaurants = new > >>> ArrayList<Restaurant>(); > > >>> public int getSize() { > >>> return restaurants.size(); > >>> } > > >>> public List<Restaurant> getRestaurants() { > >>> return this.restaurants; > >>> } > > >>> public Restaurant getRestaurant(int i) { > >>> return this.restaurants.get(i); > >>> } > > >>> public void setRestaurants(List<Restaurant> restaurants) { > >>> this.restaurants = restaurants; > >>> } > > >>> public List<String> getRestaurantNames() { > > >>> List<String> restaurantNames = new ArrayList<String>(); > > >>> for (int i=0; i<this.restaurants.size(); i++) { > > >>> restaurantNames.add(this.restaurants.get(i).getName()); > >>> } > > >>> return restaurantNames; > >>> } > > >>> } > > >>> **************************Restaurant class************************** > > >>> public class Restaurant implements Parcelable{ > > >>> private String name; > >>> /* more stuff */ > > >>> public Restaurant() {} > > >>> public String getName() { > >>> return this.name; > >>> } > > >>> public void setName(String name) { > >>> this.name = name; > >>> } > > >>> public void writeToParcel(Parcel out, int flags) { > > >>> out.writeStringArray(new String[] {this.name, /* more > >>> stuff*/}); > > >>> } > > >>> public static final Parcelable.Creator CREATOR = new > >>> Parcelable.Creator() { > > >>> public Restaurant createFromParcel(Parcel in) { return new > >>> Restaurant(in); } > > >>> public Restaurant[] newArray(int size) { return new > >>> Restaurant[size]; } > > >>> }; > > >>> private Restaurant(Parcel in) { > > >>> String[] stringData = new String[6]; > > >>> in.readStringArray(stringData); > > >>> this.name = stringData[0]; > >>> /* more stuff */ > > >>> } > > >>> public int describeContents(){ > >>> return 0; > >>> } > > >>> } > > >> -- > >> Kostya Vasilev -- WiFi Manager + pretty widget > >> --http://kmansoft.wordpress.com > > -- > Kostya Vasilev -- WiFi Manager + pretty widget --http://kmansoft.wordpress.com -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en