diff --git a/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java b/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java index 62c9dad58..69fdf98f2 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/SearchDialog.java @@ -176,6 +176,7 @@ public class SearchDialog extends CommonSearchDialog { .subscribeOn(Schedulers.single()) .doOnNext(r -> LOG.debug("search event: {}", r)) .switchMap(text -> prepareSearch(text) + .doOnError(e -> LOG.error("Error prepare search: {}", e.getMessage(), e)) .subscribeOn(Schedulers.single()) .toList() .toFlowable(), 1) diff --git a/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java b/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java index 81a3f72f4..471d29e17 100644 --- a/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java +++ b/jadx-gui/src/main/java/jadx/gui/utils/search/SimpleIndex.java @@ -12,10 +12,14 @@ public class SimpleIndex implements SearchIndex { private final List keys = new ArrayList<>(); private final List values = new ArrayList<>(); + private final Object syncData = new Object(); + @Override public void put(String str, T value) { - keys.add(str); - values.add(value); + synchronized (syncData) { + keys.add(str); + values.add(value); + } } @Override @@ -39,13 +43,15 @@ public class SimpleIndex implements SearchIndex { @Override public Flowable search(final String searchStr, final boolean caseInsensitive) { return Flowable.create(emitter -> { - int size = size(); - for (int i = 0; i < size; i++) { - if (isMatched(keys.get(i), searchStr, caseInsensitive)) { - emitter.onNext(values.get(i)); - } - if (emitter.isCancelled()) { - return; + synchronized (syncData) { + int size = keys.size(); + for (int i = 0; i < size; i++) { + if (isMatched(keys.get(i), searchStr, caseInsensitive)) { + emitter.onNext(values.get(i)); + } + if (emitter.isCancelled()) { + return; + } } } emitter.onComplete(); @@ -54,6 +60,8 @@ public class SimpleIndex implements SearchIndex { @Override public int size() { - return keys.size(); + synchronized (syncData) { + return keys.size(); + } } }