我創建了一個自定義類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