在我的应用程序中,我有一个活动,其成员变量名为mSelectedContacts
,类型为HashSet<Integer>
,这是活动状态的一部分,因此我将其保存在onSaveInstanceState()
中,就像这样
public void onSaveInstanceState(Bundle savedInstanceState) {
savedInstanceState.putSerializable(STATE_SELECTED_CONTACTS, mSelectedContacts);
super.onSaveInstanceState(savedInstanceState);
}
当重新创建活动时,我会像这样获得存储的Hashset。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null &&
savedInstanceState.containsKey(STATE_SELECTED_CONTACTS)) {
mSelectedContacts = (HashSet<Integer>)
savedInstanceState.getSerializable(STATE_SELECTED_CONTACTS);
} else
mSelectedContacts = new HashSet<Integer>();
...
现在这样可以正常工作,但它会生成一个未经检查的强制转换警告(从java.io.serializable到java.lang.Integer)。是否有其他方法将可序列化对象保存到一个包中,然后检索它而不会收到此警告? (除了当然压制它: - ))
答案 0 :(得分:1)
当您使用putSerializable(String key, Serializable value)
方法在Bundle中存储某些内容时,您会丢失有关所存储数据类型的一些信息,因为该方法会存储任何Serializable
并且它并不关心它是否&# 39; Serializable
的特定实现,即HashSet
。由于信息丢失,因此无法在getSerializable
中神奇地确定您存储的类型。因此,基本上任何避免显式施法引起的警告的尝试都不会阻止实际施法。
答案 1 :(得分:0)
您可以尝试使用Integer ArrayList和中间件:
savedInstanceState.putIntegerArrayList(STATE_SELECTED_CONTACTS, new ArrayList<Integer>(mSelectedContacts));
然后像这样读回来:
mSelectedContacts = new HashSet<Integer>(savedInstanceState.getIntegerArrayList(STATE_SELECTED_CONTACTS));
答案 2 :(得分:0)
if (savedInstanceState != null &&
savedInstanceState.containsKey(STATE_SELECTED_CONTACTS)) {
mSelectedContacts = Sets.newHashSet(savedInstanceState.getIntegerArrayList(STATE_SELECTED_CONTACTS);
} else
mSelectedContacts = new HashSet<Integer>();
和
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putIntegerArrayList(STATE_SELECTED_CONTACTS, Lists.newArrayList(mSelectedContacts);
}
但它有点多余,我建议在这种情况下忽略此警告。 因为您知道序列化字段类型是HashSet