尝试在SharedPreferences,Android中存储大数据时出现OutOfMemoryError

时间:2014-09-21 21:10:06

标签: android gson android-sharedpreferences

问题:我想将大量的对象地图(1000个联系人)存储到SharedPreferences中。

我有Cordova应用程序,第一次加载所有联系人并将所有照片转换为base64字符串。

通常这个过程可能需要大约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中存储Map,还是可以以某种方式存储OutputStream

2 个答案:

答案 0 :(得分:1)

使用文件http://developer.android.com/guide/topics/data/data-storage.html。共享首选项不应存储大数据。使用文件或sqlote数据库。

答案 1 :(得分:0)

如果您想存储大量数据,则无法使用共享首选项。您应该在设备上使用SQLite数据库。您可以在documentation中阅读如何正确执行此操作