【问题标题】:OutOfMemoryError when try to store big data in SharedPreferences, Android尝试在 SharedPreferences、Android 中存储大数据时出现 OutOfMemoryError
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您想存储大量数据,共享首选项不是可行的方法。您可能应该在设备上使用 SQLite 数据库。您可以阅读documentation 中的具体操作方法

    【讨论】:

    • 我知道,但我实际上只需要SELECT *。据我所知,SQLite 比 SharePreferences 慢,当你想运行一些有条件的查询时,它很好用
    • @fessy As I know SQLite is slower then SharePreferences - 你怎么知道?你量过吗? TmKVU 是对的。 SharedPreferences 不是要走的路。如果您不想要 SQLite(对于 1000 个联系人来说会非常快),请存储 JSON 文件。
    • @Simon 虽然搜索特定键可能会很慢,但这不会影响您的性能。由于您将请求整个数据集,因此不涉及搜索,您实际上是以一种方便的方式请求整个文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 2015-02-26
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多