我创建了一个自定义类RestaurantList的实例来保存我的数据(从Web服务接收的餐馆数据列表作为json数据)。如何在onSaveInstanceState中保存自定义类的实例?
如何将其保存在onSaveInstanceState
?
我创建了一个自定义类RestaurantList的实例来保存我的数据(从Web服务接收的餐馆数据列表作为json数据)。如何在onSaveInstanceState中保存自定义类的实例?
如何将其保存在onSaveInstanceState
?
自定义对象在实现接口Parcelable
时可以保存在Bundle内。
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("key", myObject);
}
基本上下面的方法必须在类文件来实现: 然后,他们可以通过保存
public class MyParcelable implements Parcelable {
private int mData;
public int describeContents() {
return 0;
}
/** save object in parcel */
public void writeToParcel(Parcel out, int flags) {
out.writeInt(mData);
}
public static final Parcelable.Creator<MyParcelable> CREATOR
= new Parcelable.Creator<MyParcelable>() {
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
/** recreate object from parcel */
private MyParcelable(Parcel in) {
mData = in.readInt();
}
}
我知道“这起案件是冷”,但因为我发现这个线程首先,当我搜索完全相同的东西时(现在找到了答案):
想象一下Bundle是一个XML文件。 如果您创建新的<BUNDLE name="InstanceName" type="ClassName">
,则可以在新的空白名称空间中自由添加元素和属性。
当你的MainActivity的onSaveInstance(Bundle outState)
被称为(你也可以强制这),你可以创建一个新的:Bundle b = new Bundle();
然后打电话给你的(可能不是继承和未覆盖)自定义的方法onSaveInstance(Bundle b)
在自己的类与您新创建的捆绑b。 那么你MainActivity的(在onSaveInstance(Bundle outState)
),拨打outState.putBundle("StringClassAndInstanceName", b);
当你发现这个字符串中的onCreate,你可以使用一个开关/箱重新创建该对象或(更好)已经于您的自定义类工厂功能工作与Bundle和“StringClassAndInstanceName”。
我发现从JSON转换回来的工作量较少,相比之下 – Arcantos 2016-08-04 22:06:53
onSaveInstanceState应该在函数的末尾! https://developer.android.com/training/basics/activity-lifecycle/recreating.html – 2016-09-28 20:08:00
尽管这是将自定义对象保存在onSaveInstanceState()中的正确方法,但应确保不使用此方法保存大对象。这只是为了保存屏幕的状态。如果对象变大,则有可能发生'TransactionTooLargeException'异常 – abat 2017-04-27 10:07:26