所以我有一个Calendar obj,它默认实现serializable,我想把它传递给一个bundle,所以它的值保存在屏幕旋转上。
我应该将其作为可序列化传递还是提取值并重新创建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));
答案 0 :(得分:2)
Serializable
不建议使用Android
;请改用Parcelable
。
我猜它取决于Object
的大小以及手动重建的麻烦。
答案 1 :(得分:1)
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);
答案 2 :(得分:0)
老实说,虽然Parcelable
绝对是首选的序列化方法,但我认为对于这种情况你只需将它作为Serializable
额外添加。考虑到重新创建Activity
所完成的工作量,我认为序列化Calendar
实例的费用可以忽略不计。
如果不出意外,它会使您的代码更易于维护和简洁。
答案 3 :(得分:0)
您可以将自定义对象或任何原始数据类型(即“活动”状态)保存为
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(KEY_CALENDAR, cal);
}
onRestoreInstanceState()方法用于恢复活动的状态。
在onStart()方法之后调用
您可以将活动状态恢复为
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
cal = (Calendar) savedInstanceState.getSerializable(KEY_CALENDAR);
}
您可以在此处使用serializable来保存活动的状态。
您还可以使用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());
}
}