Android: 我应该传入可序列化对象还是从 Bundle 重新创建对象?
Android: Should I pass in serializable or recreate the object from Bundle?
所以我有一个默认实现可序列化的 Calendar obj,我想将它传递到一个包中,以便它的值在屏幕旋转时保存。
我应该将其作为可序列化对象传递还是提取值并重新创建 obj 以提高效率?
bundle.putSerializable("key", calendar);
或
bundle.putInt("dayKey", calendar.get(Calendar.DAY_OF_MONTH));
bundle.putInt("monthKey", calendar.get(Calendar.MONTH));
bundle.putInt("yearKey", calendar.get(Calendar.YEAR));
不推荐在Android
中使用Serializable
;请改用 Parcelable
。
我猜这取决于 Object
的大小以及手动重新创建的麻烦程度。
老实说,虽然 Parcelable
绝对是首选的序列化方法,但我认为对于这种情况,您只需将其作为 Serializable
额外添加即可。考虑到重新创建 Activity
的工作量,我认为序列化 Calendar
实例的费用可以忽略不计。
如果不出意外,它会使您的代码更易于维护和简洁。
选择 Parcelable
而不是 Serializable
。如果性能很重要,Parcelable
可能会快 10 倍左右 (http://www.developerphil.com/parcelable-vs-serializable/)
此外,您可以使用 https://github.com/johncarl81/parceler 来避免生成(和维护!)所有本来会存在的样板代码。
@Parcel
public class Person {
...
}
Parcelable parcelable = Parcels.wrap(new Person(..));
Person = Parcels.unwrap(parcelable);
- onSaveInstanceState 方法用于商店 Activity 的状态。当 activity 您 旋转屏幕 或 按主页按钮 或打开新的 activity 时调用来自通知栏.
- 它在 onPause() 方法之后调用。
您可以将自定义对象或任何原始数据类型(即称为 Activity 的状态)保存为
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(KEY_CALENDAR, cal);
}
onRestoreInstanceState() 方法用于恢复 Activity 的状态。
在onStart()方法之后调用
你可以像
一样恢复Activity的状态
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
}
这里可以使用serializable来保存Activity的状态。
您也可以使用 onCreate() 方法来恢复您保存的状态,因为 bundle 在 onCreate() 和 onRestoreInstanceState() 两种方法中交付是相同的,例如
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(savedInstanceState != null) {
cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
} else {
cal = Calendar.getInstance();
cal.setTime(new Date());
}
}
所以我有一个默认实现可序列化的 Calendar obj,我想将它传递到一个包中,以便它的值在屏幕旋转时保存。
我应该将其作为可序列化对象传递还是提取值并重新创建 obj 以提高效率?
bundle.putSerializable("key", calendar);
或
bundle.putInt("dayKey", calendar.get(Calendar.DAY_OF_MONTH));
bundle.putInt("monthKey", calendar.get(Calendar.MONTH));
bundle.putInt("yearKey", calendar.get(Calendar.YEAR));
不推荐在Android
中使用Serializable
;请改用 Parcelable
。
我猜这取决于 Object
的大小以及手动重新创建的麻烦程度。
老实说,虽然 Parcelable
绝对是首选的序列化方法,但我认为对于这种情况,您只需将其作为 Serializable
额外添加即可。考虑到重新创建 Activity
的工作量,我认为序列化 Calendar
实例的费用可以忽略不计。
如果不出意外,它会使您的代码更易于维护和简洁。
选择 Parcelable
而不是 Serializable
。如果性能很重要,Parcelable
可能会快 10 倍左右 (http://www.developerphil.com/parcelable-vs-serializable/)
此外,您可以使用 https://github.com/johncarl81/parceler 来避免生成(和维护!)所有本来会存在的样板代码。
@Parcel
public class Person {
...
}
Parcelable parcelable = Parcels.wrap(new Person(..));
Person = Parcels.unwrap(parcelable);
- onSaveInstanceState 方法用于商店 Activity 的状态。当 activity 您 旋转屏幕 或 按主页按钮 或打开新的 activity 时调用来自通知栏.
- 它在 onPause() 方法之后调用。
您可以将自定义对象或任何原始数据类型(即称为 Activity 的状态)保存为
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable(KEY_CALENDAR, cal); }
onRestoreInstanceState() 方法用于恢复 Activity 的状态。
在onStart()方法之后调用
你可以像
一样恢复Activity的状态@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR); }
这里可以使用serializable来保存Activity的状态。
您也可以使用 onCreate() 方法来恢复您保存的状态,因为 bundle 在 onCreate() 和 onRestoreInstanceState() 两种方法中交付是相同的,例如
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if(savedInstanceState != null) { cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR); } else { cal = Calendar.getInstance(); cal.setTime(new Date()); } }