领域:无法在真正的Android设备上解析110k对象

时间:2018-04-23 12:28:30

标签: android realm retrofit2

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

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万用户进行偏移,没有改变。请帮忙。

1 个答案:

答案 0 :(得分:0)

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