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

Reply via email to