From 801fec3eaa124abb730ad4d9336bc5101fbf3b39 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Thu, 17 Nov 2022 18:22:21 -0300 Subject: [PATCH] another attempt to fix async item view crashes --- gradle.properties | 2 +- src/main/java/appeng/client/me/ItemRepo.java | 26 +++++++++++--------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/gradle.properties b/gradle.properties index 931eec0c8..86543fbf7 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ aebuild=7 aegroup=appeng aebasename=appliedenergistics2 extended=extended_life -extendedversion=v0.54.11 +extendedversion=v0.54.12 ######################################################### # Versions # ######################################################### diff --git a/src/main/java/appeng/client/me/ItemRepo.java b/src/main/java/appeng/client/me/ItemRepo.java index 94955702e..9153d9d8a 100644 --- a/src/main/java/appeng/client/me/ItemRepo.java +++ b/src/main/java/appeng/client/me/ItemRepo.java @@ -47,6 +47,8 @@ public class ItemRepo { private final IItemList list = AEApi.instance().storage().getStorageChannel(IItemStorageChannel.class).createList(); private final List view; + private List asyncUpdatedView; + private boolean updated; private final IScrollSource src; private final ISortSource sortSrc; @@ -62,17 +64,16 @@ public class ItemRepo { this.sortSrc = sortSrc; this.view = Collections.synchronizedList(new ArrayList<>()); + this.asyncUpdatedView = Collections.synchronizedList(new ArrayList<>()); list.forEach(this.view::add); } public IAEItemStack getReferenceItem(int idx) { idx += this.src.getCurrentScroll() * this.rowSize; - synchronized (this.view) { - if (idx >= this.view.size()) { - return null; - } - return this.view.get(idx); + if (idx >= this.view.size()) { + return null; } + return this.view.get(idx); } void setSearch(final String search) { @@ -107,6 +108,13 @@ public class ItemRepo { return; } + if (updated) { + this.view.clear(); + this.view.addAll(asyncUpdatedView); + this.asyncUpdatedView.clear(); + this.updated = false; + } + // Since sortSrc is final, so we can safely call it inside lambda searchTask = CompletableFuture.supplyAsync(() -> { IItemList list = this.list.clone(); @@ -210,15 +218,11 @@ public class ItemRepo { return view; }).thenAcceptAsync(view -> { - synchronized (this.view) { - this.view.clear(); - } - this.view.addAll(view); + this.updated = true; + this.asyncUpdatedView.addAll(view); }).thenRunAsync(() -> { this.searchTask = null; // Prevent redundant cancellation }); - - } private void updateJEI(String filter) {