diff --git a/src/main/java/ru/touchin/roboswag/core/observables/collections/ObservableFilteredList.java b/src/main/java/ru/touchin/roboswag/core/observables/collections/ObservableFilteredList.java index ce67884..d429b18 100644 --- a/src/main/java/ru/touchin/roboswag/core/observables/collections/ObservableFilteredList.java +++ b/src/main/java/ru/touchin/roboswag/core/observables/collections/ObservableFilteredList.java @@ -7,6 +7,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.Executors; import io.reactivex.disposables.Disposable; import io.reactivex.functions.Function; @@ -41,6 +42,9 @@ public class ObservableFilteredList extends ObservableCollection { return result; } + // we need to filter on 1 thread to prevent parallel filtering + @NonNull + private final Scheduler filterScheduler = Schedulers.from(Executors.newSingleThreadExecutor()); @NonNull private List filteredList; @NonNull @@ -50,6 +54,10 @@ public class ObservableFilteredList extends ObservableCollection { @Nullable private Disposable sourceCollectionSubscription; + public ObservableFilteredList() { + this(new ArrayList<>(), null); + } + public ObservableFilteredList(@NonNull final Function filter) { this(new ArrayList<>(), filter); } @@ -63,7 +71,7 @@ public class ObservableFilteredList extends ObservableCollection { this.filter = filter; this.sourceCollection = sourceCollection; this.filteredList = filterCollection(this.sourceCollection.getItems(), this.filter); - update(); + updateInternal(); } /** @@ -73,7 +81,7 @@ public class ObservableFilteredList extends ObservableCollection { */ public void setSourceCollection(@Nullable final ObservableCollection sourceCollection) { this.sourceCollection = sourceCollection != null ? sourceCollection : new ObservableList<>(); - update(); + updateInternal(); } /** @@ -83,7 +91,7 @@ public class ObservableFilteredList extends ObservableCollection { */ public void setSourceCollection(@Nullable final Collection sourceCollection) { this.sourceCollection = sourceCollection != null ? new ObservableList<>(sourceCollection) : new ObservableList<>(); - update(); + updateInternal(); } /** @@ -93,19 +101,16 @@ public class ObservableFilteredList extends ObservableCollection { */ public void setFilter(@Nullable final Function filter) { this.filter = filter; - update(); + updateInternal(); } - /** - * Updates collection by current filter. Use it if some item's parameter which is important for filtering have changing. - */ - private void update() { + private void updateInternal() { if (sourceCollectionSubscription != null) { sourceCollectionSubscription.dispose(); sourceCollectionSubscription = null; } sourceCollectionSubscription = sourceCollection.observeItems() - .observeOn(Schedulers.computation()) + .observeOn(filterScheduler) .subscribe(items -> { final List oldFilteredList = filteredList; filteredList = filterCollection(items, filter); @@ -113,6 +118,13 @@ public class ObservableFilteredList extends ObservableCollection { }); } + /** + * Updates collection by current filter. Use it if some item's parameter which is important for filtering have changing. + */ + public void update() { + updateInternal(); + } + @Override public int size() { return filteredList.size();