领域executeTransactionAsync()行为异常,导致UI冻结

时间:2018-08-29 12:47:39

标签: android realm

我正试图在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;
}

0 个答案:

没有答案