使用ConcurrentHashMap
和androids parcel机制时,我遇到了一些奇怪的行为。
我的情况是,我有一个ConcurrentHashMap,它在某些时候被包含了。我按照推荐的方式将它序列化为Bundle,然后将包写入parcel:
ConcurrentHashMap<String, CustomClass> concurrentMap = new ConcurrentHashMap<>();
...
@Override
public void writeToParcel ( Parcel dest, int flags ) {
Bundle map = new Bundle(1);
map.putSerializable("map", concurrentMap);
dest.writeBundle(map);
}
我稍后会检索它:
public void readFromParcel ( Parcel in ) {
Bundle map = in.readBundle(CustomClass.class.getClassLoader());
concurrentMap = (ConcurrentHashMap<String, CustomClass>) map.getSerializable("map");
}
ClassCastException 在尝试将检索到的地图强制转换回ConcurrentHashMap
时在最后一行发生。
由于HashMap和ConcurrentHashMap
都实现了Serializable
接口并扩展了AbstractMap
,因此我不太了解这个问题。
有人经历过这个或者可以解释这个问题吗?
答案 0 :(得分:2)
好的,所以这不是解释,但至少有一个快速解决方案。我不喜欢它,但它有效。
因为&#39; getSerializable()&#39;以某种方式将我的ConcurrentHashMap视为普通的HashMap,我暂时使用HashMap来获取ConcurrentHashMap。
HashMap<String, CustomClass > tempMap = (HashMap<String, CustomClass >) map.getSerializable("map");
concurrentMap = new ConcurrentHashMap<>(tempMap);