【发布时间】:2014-09-21 21:10:06
【问题描述】:
问题:我想将巨大的对象地图(1000 个联系人)存储到 SharedPreferences 中。
我有 Cordova 应用程序,其中第一次加载所有联系人并将所有照片转换为 base64 字符串。
通常,此过程可能需要大约 30 秒。出于这个原因,我的目标是将所有联系人作为字符串存储到 SharedPreferences 以便快速加载。
我使用 GSON 库,但无论我做什么,我都会得到:
java.lang.OutOfMemoryError
at java.lang.String.<init>(String.java:354)
at java.lang.String.<init>(String.java:171)
at java.io.ByteArrayOutputStream.toString(ByteArrayOutputStream.java:137)
这是我将 Map 转换为 ByteArrayOutputStream 但在最后一行得到异常的方法:out.toString()
public static String getStrFromGroupsListJSONObject(ConcurrentHashMap<String, WmContactImage> contactMap){
Gson gson = getInstance();
OutputStream out = new ByteArrayOutputStream();
try {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8"));
Iterator<String> it = contactMap.keySet().iterator();
WmContactImage img;
writer.beginObject(); // {
while(it.hasNext()){
String key = it.next();
writer.name(key);
img = contactMap.get(key);
gson.toJson(img, WmContactImage.class, writer);
}
writer.endObject(); // }
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return out.toString();
}
有没有其他方法可以将 Map 存储在 SharedPreferences 中,或者我可以以某种方式存储 OutputStream?
【问题讨论】:
-
“我想将巨大的对象地图(1000 个联系人)存储到 SharePreferences 中”——为什么?如果这是 JSON,请使用 JSON 文件。
-
@CommonsWare 我没有 JSON。我尝试创建一个。如果我将我的 MAP 转换为 JSON string ,我会得到
OutOfMemoryError。所以我使用了JsonWriter。但是当尝试从ByteArrayOutputStream获取字符串时仍然得到相同的异常。谢谢, -
@CommonsWare 唯一可行的方法是将地图拆分为多个部分并逐个保存
标签: android gson android-sharedpreferences