【发布时间】: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 个用户,什么都没有改变了。请帮忙。
【问题讨论】: