Я хочу сохранить список объектов Parcelable Restaurant в onSaveInstanceState. Я создал класс Restaurant, расширяющий Parcelable, и объект RestaurantList, оба показаны ниже.
В своей основной деятельности я заполняю свой RestauranList напрямую из интернет-данных json, используя GSON:
restaurantList = gson.fromJson(r, RestaurantList.class);
Теперь, когда я хочу сохранить объекты списка ресторанов, используя
protected void onSaveInstanceState(Bundle outState) {
if (restaurantList != null ) {
outState.putParcelableArrayList("restoList", (ArrayList<Restaurant>)restaurantList.getRestaurants());
}
super.onSaveInstanceState(outState);
}
Я получаю сообщение об ошибке (показано ниже), я думаю, потому что данные, которые можно отправить, не записываются. Как я должен это делать? Нужно ли создавать массив объектов Parcel в моей основной деятельности и заполнять его, вызывая writeToParcel для каждого из объектов Restaurant?
спасибо за любые предложения
Julien
++++++
LogCat (происходит сбой в outState.putParcelableArrayList ("restoList", (ArrayList) restaurantList.getRestaurants ());
)
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
Класс ресторанного списка
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;
}
}
Ресторанный класс
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;
}
}