Проблема: Я хочу хранить огромную карту объектов (1000 контактов) в SharedPreferences.OutOfMemoryError при попытке сохранить большие данные в SharedPreferences, Android
У меня есть приложение Cordova, где в первый раз загружается все контакты и конвертируются все фотографии в base64 String.
Обычно этот процесс может занять около 30 секунд. По этой причине моя цель - сохранить все контакты как String в 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)
Это мой метод, где я конвертировать мою карту в 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();
}
Есть ли способ сохранить карту в SharedPreferences или я могу как-то сохранить OutputStream
?
«Я хочу хранить огромную карту объектов (1000 контактов) в SharePreferences» - почему? Если это в JSON, используйте JSON-файл. – CommonsWare
@CommonsWare У меня нет JSON. Я пытаюсь создать его. Если я преобразую MAP в строку JSON, я получаю 'OutOfMemoryError'. Поэтому я использовал 'JsonWriter'. но все равно получайте такое же исключение, когда пытаетесь получить String из 'ByteArrayOutputStream'. Спасибо, – snaggs
@CommonsWare единственный способ, который может работать, - разделить карту на несколько частей и сохранить по одному – snaggs