我正试图在Realm中插入大约30,000个项目。当我收到来自Web服务的回调时,将构建对象。
我正在解析JSON并在事务内构建对象,从我的阅读看来,这似乎是要做的,而不是解析,构建对象然后打开事务以最终将它们提交给Realm。
我的问题是此异步事务导致我的UI在5到10秒之间的任何时间释放,所以要花相当长的时间!
这是代码,我看不到任何可能做错的事情。这些异步事务周围我缺少什么吗?
public void cragMapMarkers(long timestamp, final UKCAPICallback callback){
logbooks.cragsUKC(getKey(""), V1, timestamp).enqueue(new Callback<JsonElement>() {
@Override
public void onResponse(final Call<JsonElement> call, final Response<JsonElement> response) {
final Realm realm = Realm.getDefaultInstance();
realm.executeTransactionAsync(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
JsonObject root = response.body().getAsJsonObject();
final List<UKCCrag> ukcCrags = LogbooksParser.parseUKCMapMarkers(root);
realm.copyToRealmOrUpdate(ukcCrags);
}
}, new Realm.Transaction.OnSuccess() {
@Override
public void onSuccess() {
callback.onSuccess("");
realm.close();
}
}, new Realm.Transaction.OnError() {
@Override
public void onError(Throwable error) {
callback.onFailure("Failed to parse UKCCrags");
realm.close();
}
});
}
@Override
public void onFailure(Call<JsonElement> call, Throwable throwable) {
callback.onFailure("Failed to fetch UKCCrags");
}
});
}
解析器:
public static List<UKCCrag> parseUKCMapMarkers(JsonObject root){
List<UKCCrag> ukcCrags = new ArrayList<>();
for(int i = 0; i < root.getAsJsonArray("markers").size(); i++) {
JsonObject ukcCragJson = root.getAsJsonArray("markers").get(i).getAsJsonObject();
UKCCrag ukcCrag = new UKCCrag();
ukcCrag.setObjectId(Integer.toString(ukcCragJson.get("id").getAsInt()));
ukcCrag.setEditDate(ukcCragJson.get("editDate").getAsInt());
ukcCrag.setId(ukcCragJson.get("id").getAsInt());
ukcCrag.setRockfaxId(ukcCragJson.get("rockfaxID").getAsInt());
ukcCrag.setLat(ukcCragJson.get("lat").getAsDouble());
ukcCrag.setLng(ukcCragJson.get("lng").getAsDouble());
ukcCrag.setNRoutes(ukcCragJson.get("nroutes").getAsInt());
ukcCrag.setTitle(ukcCragJson.get("title").getAsString());
ukcCrag.setCountyId(ukcCragJson.get("countyID").getAsInt());
if(ukcCragJson.has("thumbID"))
ukcCrag.setThumbId(ukcCragJson.get("thumbID").getAsInt());
ukcCrags.add(ukcCrag);
}
return ukcCrags;
}