【问题标题】:Realm: can't parse 110k objects on real android device领域:无法在真正的 android 设备上解析 110k 对象
【发布时间】:2018-04-23 12:28:30
【问题描述】:

本质上,问题在于标题。详细说明:我正在使用 Realm 进行存储 设备存储中的用户。我正在向服务器发出一个请求,该请求返回包含 110k 个对象的列表,gson 对此进行解析,所有来自内存不足的操作都已完成。在模拟器上,此操作持续约 3 分钟,并成功保存到 db。所有 json 数据都是有效的,如果不是,在模拟器上它也会崩溃。 但是,当我在真正的安卓设备上查看时,我得到了这个

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected ':' at line 2 column 3 path $[70816].info2000

当 gson 试图解析 70816 对象时它无法解析,因为它无效。我在数据库中重新检查了这个用户。一切都很好。我又跑了,在另一个对象上得到了这个异常

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Expected name at line 2 column 1091 path $[56000].accountCrm

所以它是随机的。 我很困惑并开始研究,但我找不到任何东西。这些对象来自响应体(okhttp),我这样解析它:

Gson gson = GsonBase.getGlobalGson();
    JsonReader reader = new JsonReader(responseBody.charStream()); //these are my 110k objects
    reader.setLenient(true);
    reader.beginArray();
    List<ContactCRMRealm> contactCRMRBuffer = new ArrayList<>();
    int counter = 0;
    while (reader.hasNext()) {
        if (counter < BUFFER_SIZE) {
            contactCRMRBuffer.add(gson.fromJson(reader, ContactCRMRealm.class));
            counter++;
        } else {
            defaultInstance.executeTransaction(realm1 -> realm1.insertOrUpdate(contactCRMRBuffer));
            counter = 0;
            contactCRMRBuffer.clear();
        }
    }
    defaultInstance.executeTransaction(realm1 -> realm1.insertOrUpdate(contactCRMRBuffer));
    contactCRMRBuffer.clear();
    reader.endArray();

在这一行抛出异常:

contactCRMRBuffer.add(gson.fromJson(reader, ContactCRMRealm.class));

我不知道,但似乎响应体被意外破坏了。为什么它可以在模拟器上运行,而不能在 android 设备上运行?我可以说的几件事:当我在 else 块中评论这一行时:

defaultInstance.executeTransaction(realm1 -> realm1.insertOrUpdate(contactCRMRBuffer));

所有解析端均无例外地执行。我想是因为境界。但究竟是什么?我使用 createOrUpdateAllFromJson() 领域方法重写了这个解析:

defaultInstance.beginTransaction();
    try {
        defaultInstance.createOrUpdateAllFromJson(ContactCRMRealm.class, responseBody.byteStream());
        defaultInstance.commitTransaction();
    } catch (IOException e) {
        defaultInstance.close();
    } finally {
        defaultInstance.close();
    }

在模拟器上内存不足(wtf),在真实设备上 10 分钟内没有发生任何事情,并且引发了登录异常(读取超时 10 分钟)。另外我试图通过一个请求来抵消 10,000 个用户,什么都没有改变了。请帮忙。

【问题讨论】:

    标签: android realm retrofit2


    【解决方案1】:

    好的,经过一天的调查,问题解决了。 Realm 在应用程序中是 2.3.0 版本(是的,真的很旧),所以我在想可能需要升级到更新的版本。我做到了,我将领域升级到 3.7.0(不是最后一个,因为 rxjava1 在应用程序中使用)。就是这样。有很多改进,尤其是速度改进,所以现在一切都很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 2014-03-22
      相关资源
      最近更新 更多