Package io.objectbox.query
Class QueryPublisher<T>
- java.lang.Object
-
- io.objectbox.query.QueryPublisher<T>
-
- All Implemented Interfaces:
DataPublisher<java.util.List<T>>,java.lang.Runnable
@Internal class QueryPublisher<T> extends java.lang.Object implements DataPublisher<java.util.List<T>>, java.lang.Runnable
ADataPublisherthat subscribes to an ObjectClassPublisher if there is at least one observer. Publishing is requested if the ObjectClassPublisher reports changes, a subscription isobservedorQuery.publish()is called. For publishing the query is re-run and the result delivered to the current observers. Results are published on a single thread, one at a time, in the order publishing was requested.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description private static classQueryPublisher.SubscribedObservers<T>
-
Field Summary
Fields Modifier and Type Field Description private Box<T>boxprivate DataObserver<java.lang.Class<T>>objectClassObserverprivate DataSubscriptionobjectClassSubscriptionprivate java.util.Set<DataObserver<java.util.List<T>>>observersprivate booleanpublisherRunningprivate java.util.Deque<DataObserver<java.util.List<T>>>publishQueueprivate Query<T>queryprivate QueryPublisher.SubscribedObservers<T>SUBSCRIBED_OBSERVERSPlaceholder observer to use if all subscribed observers should be notified.
-
Constructor Summary
Constructors Constructor Description QueryPublisher(Query<T> query, Box<T> box)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description (package private) voidpublish()voidpublishSingle(DataObserver<java.util.List<T>> observer, java.lang.Object param)private voidqueueObserverAndScheduleRun(DataObserver<java.util.List<T>> observer)Non-blocking: will just enqueue the changes for a separate thread.voidrun()Processes publish requests for this query on a single thread to prevent older query results getting delivered after newer query results.voidsubscribe(DataObserver<java.util.List<T>> observer, java.lang.Object param)voidunsubscribe(DataObserver<java.util.List<T>> observer, java.lang.Object param)
-
-
-
Field Detail
-
observers
private final java.util.Set<DataObserver<java.util.List<T>>> observers
-
publishQueue
private final java.util.Deque<DataObserver<java.util.List<T>>> publishQueue
-
publisherRunning
private volatile boolean publisherRunning
-
SUBSCRIBED_OBSERVERS
private final QueryPublisher.SubscribedObservers<T> SUBSCRIBED_OBSERVERS
Placeholder observer to use if all subscribed observers should be notified.
-
objectClassObserver
private DataObserver<java.lang.Class<T>> objectClassObserver
-
objectClassSubscription
private DataSubscription objectClassSubscription
-
-
Method Detail
-
subscribe
public void subscribe(DataObserver<java.util.List<T>> observer, @Nullable java.lang.Object param)
- Specified by:
subscribein interfaceDataPublisher<T>
-
publishSingle
public void publishSingle(DataObserver<java.util.List<T>> observer, @Nullable java.lang.Object param)
- Specified by:
publishSinglein interfaceDataPublisher<T>
-
publish
void publish()
-
queueObserverAndScheduleRun
private void queueObserverAndScheduleRun(DataObserver<java.util.List<T>> observer)
Non-blocking: will just enqueue the changes for a separate thread.
-
run
public void run()
Processes publish requests for this query on a single thread to prevent older query results getting delivered after newer query results. To speed up processing each loop publishes to all queued observers instead of just the next in line. This reduces time spent querying and waiting for DataObserver.onData() and their potential DataTransformers.- Specified by:
runin interfacejava.lang.Runnable
-
unsubscribe
public void unsubscribe(DataObserver<java.util.List<T>> observer, @Nullable java.lang.Object param)
- Specified by:
unsubscribein interfaceDataPublisher<T>
-
-