From e48f2acaa6efc1ae875c10bc2fc7c213c71d14ce Mon Sep 17 00:00:00 2001 From: Gavriil Sitnikov Date: Tue, 13 Jun 2017 14:40:23 +0300 Subject: [PATCH] observable filtered list changes --- .../collections/ObservableFilteredList.java | 31 +++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) 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 0d4ff8f..6898560 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,7 +7,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.concurrent.Executors; +import rx.Scheduler; import rx.Subscription; import rx.functions.Func1; import rx.schedulers.Schedulers; @@ -36,6 +38,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 @@ -45,6 +50,10 @@ public class ObservableFilteredList extends ObservableCollection { @Nullable private Subscription sourceCollectionSubscription; + public ObservableFilteredList() { + this(new ArrayList<>(), null); + } + public ObservableFilteredList(@NonNull final Func1 filter) { this(new ArrayList<>(), filter); } @@ -58,7 +67,7 @@ public class ObservableFilteredList extends ObservableCollection { this.filter = filter; this.sourceCollection = sourceCollection; this.filteredList = filterCollection(this.sourceCollection.getItems(), this.filter); - update(); + updateInternal(); } /** @@ -68,7 +77,7 @@ public class ObservableFilteredList extends ObservableCollection { */ public void setSourceCollection(@Nullable final ObservableCollection sourceCollection) { this.sourceCollection = sourceCollection != null ? sourceCollection : new ObservableList<>(); - update(); + updateInternal(); } /** @@ -78,7 +87,7 @@ public class ObservableFilteredList extends ObservableCollection { */ public void setSourceCollection(@Nullable final Collection sourceCollection) { this.sourceCollection = sourceCollection != null ? new ObservableList<>(sourceCollection) : new ObservableList<>(); - update(); + updateInternal(); } /** @@ -88,19 +97,16 @@ public class ObservableFilteredList extends ObservableCollection { */ public void setFilter(@Nullable final Func1 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.unsubscribe(); sourceCollectionSubscription = null; } sourceCollectionSubscription = sourceCollection.observeItems() - .observeOn(Schedulers.computation()) + .observeOn(filterScheduler) .subscribe(items -> { final List oldFilteredList = filteredList; filteredList = filterCollection(items, filter); @@ -108,6 +114,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();